我正在构建一个node.js应用程序,它是一个REST
api,对我的mongodb使用express和mongoose。我现在已经设置了CRUD端点,但是我只是想知道两件事。
如何扩展这种路由方式,特别是如何在路由之间共享模块。我希望我的每条路线都进入一个新文件,但是显然只有一个数据库连接,正如您所看到的,我在people.js顶部包含了猫鼬。
我是否必须在people.js中写出3次模型的架构?第一个模式定义模型,然后在createPerson和updatePerson函数中列出所有变量。感觉就像我在大声笑的日子里制作php / mysql CRUD一样。对于更新功能,我尝试编写一个循环以遍历“ p”以自动检测要更新的字段,但无济于事。任何提示或建议都很好。
另外,我很喜欢整个应用程序上的任何意见,对于Node来说是新手,所以很难知道您做某事的方式是最有效或“最佳”的做法。谢谢!
app.js
// Node Modules
var express = require('express');
app = express();
app.port = 3000;
// Routes
var people = require('./routes/people');
/*
var locations = require('./routes/locations');
var menus = require('./routes/menus');
var products = require('./routes/products');
*/
// Node Configure
app.configure(function(){
app.use(express.bodyParser());
app.use(app.router);
});
// Start the server on port 3000
app.listen(app.port);
/*********
ENDPOINTS
*********/
// People
app.get('/people', people.allPeople); // Return all people
app.post('/people', people.createPerson); // Create A Person
app.get('/people/:id', people.personById); // Return person by id
app.put('/people/:id', people.updatePerson); // Update a person by id
app.delete('/people/:id', people.deletePerson); // Delete a person by id
console.log('Server started on port ' + app.port);
people.js
//Database
var mongoose = require("mongoose");
mongoose.connect('mongodb://Shans-MacBook-Pro.local/lantern/');
// Schema
var Schema = mongoose.Schema;
var Person = new Schema({
first_name: String,
last_name: String,
address: {
unit: Number,
address: String,
zipcode: String,
city: String,
region: String,
country: String
},
image: String,
job_title: String,
created_at: { type: Date, default: Date.now },
active_until: { type: Date, default: null },
hourly_wage: Number,
store_id: Number, // Inheirit store info
employee_number: Number
});
var PersonModel = mongoose.model('Person', Person);
// Return all people
exports.allPeople = function(req, res){
return PersonModel.find(function (err, person) {
if (!err) {
return res.send(person);
} else {
return res.send(err);
}
});
}
// Create A Person
exports.createPerson = function(req, res){
var person = new PersonModel({
first_name: req.body.first_name,
last_name: req.body.last_name,
address: {
unit: req.body.address.unit,
address: req.body.address.address,
zipcode: req.body.address.zipcode,
city: req.body.address.city,
region: req.body.address.region,
country: req.body.address.country
},
image: req.body.image,
job_title: req.body.job_title,
hourly_wage: req.body.hourly_wage,
store_id: req.body.location,
employee_number: req.body.employee_number
});
person.save(function (err) {
if (!err) {
return res.send(person);
} else {
console.log(err);
return res.send(404, { error: "Person was not created." });
}
});
return res.send(person);
}
// Return person by id
exports.personById = function (req, res){
return PersonModel.findById(req.params.id, function (err, person) {
if (!err) {
return res.send(person);
} else {
console.log(err);
return res.send(404, { error: "That person doesn't exist." });
}
});
}
// Delete a person by id
exports.deletePerson = function (req, res){
return PersonModel.findById(req.params.id, function (err, person) {
return person.remove(function (err) {
if (!err) {
return res.send(person.id + " deleted");
} else {
console.log(err);
return res.send(404, { error: "Person was not deleted." });
}
});
});
}
// Update a person by id
exports.updatePerson = function(req, res){
return PersonModel.findById(req.params.id, function(err, p){
if(!p){
return res.send(err)
} else {
p.first_name = req.body.first_name;
p.last_name = req.body.last_name;
p.address.unit = req.body.address.unit;
p.address.address = req.body.address.address;
p.address.zipcode = req.body.address.zipcode;
p.address.city = req.body.address.city;
p.address.region = req.body.address.region;
p.address.country = req.body.address.country;
p.image = req.body.image;
p.job_title = req.body.job_title;
p.hourly_wage = req.body.hourly_wage;
p.store_id = req.body.location;
p.employee_number = req.body.employee_number;
p.save(function(err){
if(!err){
return res.send(p);
} else {
console.log(err);
return res.send(404, { error: "Person was not updated." });
}
});
}
});
}
我在这里采取了另一种方法。不是说这是最好的,而是让我解释一下。
require
其所需的Mongoose模型(仅1个)require
是所有路由模块的注册对象。我的应用程序根目录下有两个子文件夹- routes
和schemas
。
这种方法的好处是:
这是特定模式文件的外观:
文件:/schemas/theaterSchema.js
module.exports = function(db) {
return db.model('Theater', TheaterSchema());
}
function TheaterSchema () {
var Schema = require('mongoose').Schema;
return new Schema({
title: { type: String, required: true },
description: { type: String, required: true },
address: { type: String, required: true },
latitude: { type: Number, required: false },
longitude: { type: Number, required: false },
phone: { type: String, required: false }
});
}
这是特定资源的路由集合的外观:
文件:/routes/theaters.js
module.exports = function (app, options) {
var mongoose = options.mongoose;
var Schema = options.mongoose.Schema;
var db = options.db;
var TheaterModel = require('../schemas/theaterSchema')(db);
app.get('/api/theaters', function (req, res) {
var qSkip = req.query.skip;
var qTake = req.query.take;
var qSort = req.query.sort;
var qFilter = req.query.filter;
return TheaterModel.find().sort(qSort).skip(qSkip).limit(qTake)
.exec(function (err, theaters) {
// more code
});
});
app.post('/api/theaters', function (req, res) {
var theater;
theater.save(function (err) {
// more code
});
return res.send(theater);
});
app.get('/api/theaters/:id', function (req, res) {
return TheaterModel.findById(req.params.id, function (err, theater) {
// more code
});
});
app.put('/api/theaters/:id', function (req, res) {
return TheaterModel.findById(req.params.id, function (err, theater) {
// more code
});
});
app.delete('/api/theaters/:id', function (req, res) {
return TheaterModel.findById(req.params.id, function (err, theater) {
return theater.remove(function (err) {
// more code
});
});
});
};
这是根应用程序文件,该文件初始化了连接并注册了所有路由:
文件:app.js
var application_root = __dirname,
express = require('express'),
path = require('path'),
mongoose = require('mongoose'),
http = require('http');
var app = express();
var dbProduction = mongoose.createConnection('mongodb://here_insert_the_mongo_connection_string');
app.configure(function () {
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(application_root, "public")));
app.use('/images/tmb', express.static(path.join(application_root, "images/tmb")));
app.use('/images/plays', express.static(path.join(application_root, "images/plays")));
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
app.get('/api', function (req, res) {
res.send('API is running');
});
var theatersApi = require('./routes/theaters')(app, { 'mongoose': mongoose, 'db': dbProduction });
// more code
app.listen(4242);
希望这会有所帮助。
问题内容: 说我有这段代码来分隔expressjs中的路由: 并要求在: 1)如何以最佳方式将数据库查询分为新文件? 即使我分开数据库逻辑,该文件也会变得很大。 2)什么是分隔路线的好方法?也许是单独的模块?然后要求他们都参加? 问题答案: 这里有一个类似的问题,您应该阅读:如何构建express.js应用程序? 1)您所有的查询逻辑都应放在模型中(例如,位于/ models中的模块) 2)将您的
由于有多个实现提供了OAuth2功能,我们目前正在研究几个可用的选项。(例如Keycloak和ORY Hydra)。我们的选择取决于我们要做多少工作,改变应用程序的现有结构,如何处理数据库中的用户。但无论我们选择哪种实现方式,我们都将面临类似的问题。 问题 > react应用程序如何处理登录过程和令牌存储? 这同样适用于刷新令牌流。因为对于我自己的应用程序,我必须设置cookie,对于第三方,这必
我需要存储一些应该在我的应用程序上随处可见的数据。到目前为止,我知道三种方法来做到这一点: < li >创建一个特殊文件使变量成为全局变量(Dart中的全局变量) < li >使用共享首选项(这里我只想访问数据,不一定要永久存储) 和InheritedWidget 我想知道哪个解决方案(或另一个我不知道的解决方案)在性能和易于实现方面是最好的。
问题内容: 想象一下,你想使用Python开发非平凡的最终用户桌面(非Web)应用程序。构造项目文件夹层次结构的最佳方法是什么? 理想的功能是易于维护,IDE友好,适用于源代码控制分支/合并以及易于生成安装软件包。 尤其是: 你将源放在哪里? 你将应用程序启动脚本放在哪里? 你将IDE项目放在哪里? 你将单元/验收测试放在哪里? 你将非Python数据(例如配置文件)放在哪里? 你在哪里将非Pyt
问题内容: 我找到了几个node.js模块,用于使用ip地址查找有关客户端位置和网络的信息。 要求: 位置-国家,城市,州,纬度,经度等 网络-Internet服务提供商,Internet连接类型和Internet速度等。 数据准确性-最大可能性。 注意: 寻找服务器端解决方案。 上面提到的模块使用maxmind数据。而且我还阅读了有关maxmind数据准确性的信息。 我很少选择上面的node.j
问题内容: 我知道全局变量不好。 但是,如果我在框架的40个文件中使用节点的模块“ util”,那么最好仅将其声明为全局变量,例如: 在index.js文件中,而不是在40个文件中写入该行? 因为我经常在每个文件中使用相同的5-10个模块,这样可以节省大量时间,而不是一直复制粘贴。 在这种情况下干不好吗? 问题答案: 每个模块应该是独立的。在每个模块的第一个需求之后,require都不会花费任何东