Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
app.use(express.static(path.join(__dirname, "public"))); // отдаем статический index.html из папки public/
app.use(function(err, req, res, next){
res.status(err.status || 500);
log.error('Internal error(%d): %s',res.statusCode,err.message);
res.send({ error: err.message });
return;
});
throw new Error('my silly error');, все прекрасно обработается, сервер не упадет.app.get('/ErrorExample', function(req, res, next){
next(new Error('Random error!'));
});
А уж использовать next внутри функции, или нет, это на усмотрение разработчика.
if (next) {}
Подобный warning я бы потерпел ради чистоты кода.
function(req, res, next), где req — запрос, res — ответ, next — вызов следующего middleware. Например, 1 звено проверяет токен и если он валидный — вызывает next, 2 звено отдает данные, больше ничего не требуется делать, ответ отправлен, вызывать next не требуется.app.use(function(req, res, next){
// do smth with req & res
next();
});
app.use(function(req, res, next){
res.status(404);
log.debug('Not found URL: %s',req.url);
res.send({ error: 'Not found' });
return;
});
module.exports = function(req, res, callback) {
db.impress.collectionName.find({ fieldName: req.post.fieldValue }).toArray(function(err, nodes) {
res.context.data = nodes;
callback();
});
}
module.exports = {
guests: false, logged: true, http: true, https: true
}
var underscore = require('underscore');
app.param(":articleId", function(req, res, next, articleId){
ArticleModel.findById(articleId, function(err, article){
if(err || !article) {
return next('route');
}
req.dbArticle = article;
next();
});
});
app.post("/api/articles/:articleId?", function(req, res, next){
if(!req.dbArticle) {
req.dbArticle = new ArticleModel();
}
req.dbArticle.set(underscore.pick(req.body, 'title', 'description', 'author', 'images'));
req.dbArticle.save(function(err, article){
// ..............
})
});
Таким образом на клиенте мы меняем минимум 2 элемента, максимум — все.
Как сохранять изменения?
мы создаем новую сущность пост запросом тру вей не возвращать сущность в запоросе
server.serializeClient(function(client, done) {
return done(null, client.id);
});
server.deserializeClient(function(id, done) {
db.clients.find(id, function(err, client) {
if (err) { return done(err); }
return done(null, client);
});
});
var nconf = require('nconf');
var env = 'development',
defaults = {
'http': {
'host': '127.0.0.1',
'port': 3000
},
'mongo': {
'hostname': 'localhost',
'host': '127.0.0.1',
'port': '27017',
'username': '',
'password': '',
'db': 'test',
'uri': 'mongodb://localhost:27017/'
}
}
;
if (process.env.VCAP_SERVICES) { // AppFog
env = 'appfog';
defaults.mongo = JSON.parse(process.env.VCAP_SERVICES)['mongodb-1.8'][0]['credentials'];
defaults.mongo.uri = 'mongodb://' + defaults.mongo.username + ':' + defaults.mongo.password + '@' + defaults.mongo.hostname + ':' + defaults.mongo.port + '/';
defaults.http.host = process.env.VCAP_APP_HOST;
defaults.http.port = parseInt(process.env.VCAP_APP_PORT)
} else
if (process.env.OPENSHIFT_APP_NAME) { // OpenShift
env = 'openshift';
defaults.mongo = {
'host': process.env.OPENSHIFT_MONGODB_DB_HOST,
'port': process.env.OPENSHIFT_MONGODB_DB_PORT,
'username': process.env.OPENSHIFT_MONGODB_DB_USERNAME,
'password': process.env.OPENSHIFT_MONGODB_DB_PASSWORD,
'db': process.env.OPENSHIFT_APP_NAME,
'uri': process.env.OPENSHIFT_MONGODB_DB_URL
};
defaults.http.host = process.env.OPENSHIFT_NODEJS_IP || '127.0.0.1';
defaults.http.port = parseInt(process.env.OPENSHIFT_NODEJS_PORT) || 8080
}
nconf.argv()
.env()
.file({ file: './' + env + '.json' })
.defaults(defaults)
;
module.exports = nconf;
var uri = config.get('mongo:uri') + config.get('mongo:db');
mongoose.connect(uri);
var port = config.get('http:port'),
ipAddr = config.get('http:host')
;
app.listen(port, ipAddr, function(){
log.info('Node server started on %s:%d ...', ipAddr, port);
});
{
"mongo": {
"db": "anotherTest"
}
}
// validation
Article.path('title').validate(function (v) {
if ('undefined' == typeof v) { // чтобы node.js не "падала" при пустом теле запроса :)
return false
}
return v.length > 5 && v.length < 70
});
...
passport.use(new BasicStrategy(
function(username, password, done) {
ClientModel.findOne({ clientId: username }
...
passport-local, правильно?http POST http://localhost:1337/oauth/token grant_type=password client_id=mobileV1 client_secret=abc123456 username=andrey password=simplepasswordhttp -a mobileV1:abc123456 POST http://localhost:1337/oauth/token grant_type=password username=andrey password=simplepassword
RESTful API на Node.js + MongoDB