我正在使用 Promise 并发送响应,但在 .then() 函数中我无法使用 res.send() 发送响应;
我的代码是
var express = require ('express'); //EXPRESS Package
var bodyParser = require('body-parser');// get body-parser
var route = express.Router(); //define our app using express
var multer = require('multer');
var validator = require('validator');
var userModel = require('../../model/user.model');
var session = require('express-session');
route.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
route.use(bodyParser.json()); // for parsing application/json
// route.use(bodyParser.json({ type: 'application/vnd.api+json' }))
route.put("/personal/:id", function (req, res) {
data = {};
data['personal_details'] = req.body;
return userModel.update(req.params.id, data).then( function (result) {
// console.lssog(result);
res.send();
}).catch( function ( err ){
res.send(err).status(400);
});
});
// route.put("/contact/:id", function (req, res) {
// userModel.update(req.params.id, "contact_details", req.body).then( function () {
// res.sendStatus(200)
// }).catch( function ( err ){
// res.send(err).status(400);
// });
// });
module.exports = route;
用户模型文件是user.model.js,如下所示:
var passwordHash = require('password-hash');
var mongo = require('mongoskin');
var Q = require('q');
var _ = require('lodash');
var randomstring = require('randomstring');
var db = mongo.db('mongodb://127.0.0.1/angulardemo');
db.bind('demotest');
// var hash = bcrypt.hashSync("12345", salt);
var model = {};
model.login = login;
model.create = create;
model.update = update;
model.destroy = destroy;
model.edit = edit;
module.exports = model;
/**
* Create new user
* @param {request data} userData
*/
function create (userData){
var deferred = Q.defer();
db.demotest.findOne({"email" : userData.email}, function (err, user) {
if (err) deferred.reject(err);
if(user){
deferred.reject('Email "' + userData.email + '" is already taken');
}
else{
createUser();
}
});
function createUser() {
var user = _.omit(userData, ['password', 'c_password']);
var hashedPassword = passwordHash.generate(userData.password);
user.password = hashedPassword;
user.api_token = randomstring.generate(50);
user.registration_code = randomstring.generate(10);
user.is_active = 1;
user.is_verified = 1;
db.demotest.insert(user, function (err, doc) {
if (err) deferred.reject(err);
deferred.resolve();
});
}
return deferred.promise;
}
/**
* Login user
* @param {user request data} data
*/
function login(data) {
var deferred = Q.defer();
db.demotest.findOne({"email" : data.email}, function (err, user) {
if (err) deferred.reject(err);
if(!user) deferred.reject("User not found");
if(user && passwordHash.verify(data.password, user.password)){
deferred.resolve(user);
}
else{
deferred.reject("Invalid Credential");
}
});
return deferred.promise;
}
/**
* Update User
* @param {user id} id
* @param {user data} data
*/
function update(id, data){
var deferred = Q.defer();
// validation
db.demotest.findById(id, function (err, user) {
if (err) deferred.reject(err);
if (user.id !== id) {
// username has changed so check if the new username is already taken
db.demotest.findOne(
{ _id: id },
function (err, user) {
if (err) deferred.reject(err);
if (user) {
// username already exists
deferred.reject('User "' + user.username + '" is already taken')
} else {
updateUser();
}
});
} else {
updateUser();
}
});
function updateUser() {
db.demotest.update(
{ _id: mongo.helper.toObjectID(id) },
{ $set: data },
function (err, doc) {
if (err) deferred.reject(err);
deferred.reject("err");
});
}
return deferred.promise;
// var deferred = Q.defer();
// db.demotest.update({_id : mongo.helper.toObjectID(id)}, {$set: data}, function (err, result) {
// console.log(result);
// if (err) deferred.reject(err);
// deferred.resolve("OLLLL");
// });
// return deferred.promise;
}
function destroy() {
}
function edit() {
}
// var insertTestDoc = function (db, callback) {
// //console.log("one"); return ;
// var collection = db.collection('demotest');
// collection.insertOne({"title" : "demotest", "description" : "Lorem Ipsum Sit Emet.", "password" : hash}, function ( err, db ){
// assert.equal(err, null);
// callback();
// });
// }
// var login = function (db, callback) {
// var collection = db.collection('demotest')
// var cursor = collection.findOne({"title" : "demotest"});
// console.log(cursor);
// // cursor.each(function(err, doc) {
// // assert.equal(err, null);
// // if (doc != null) {
// // console.log(doc);
// // } else {
// // callback();
// // }
// // });
// }
// MongoClient.connect('mongodb://localhost/angulardemo', function ( err, db ){
// assert.equal( null, err );
// console.log("Connected to the server correctly");
// login(db, function () {
// db.close();
// });
// // insertTestDoc(db, function () {
// // db.close();
// // });
// });
请帮忙谢谢
最佳答案
根据您所展示的内容,我可以想到两种可能性,其中之一取决于您使用的 Mongoose 版本。实际上, Mongoose 的使用是我的一个假设,因为你从未提到它......
更有可能的是您从未真正连接到数据库。在您的代码中的某个地方,需要调用 mongoose.connect()
或 mongoose.createConnection()
在应用程序启动时触发(或者至少在您看到的请求挂起之前)。
如果您实际上正在这样做并且只是没有分享它,那么接下来最有可能的事情是您使用的是 4.0 之前的 mongoose 版本,其中查询(例如 .update()
)没有遵循 Promise api,并且您调用了 exec()
,如下所示:
myModel.findOneAndUpdate(req.params.id, data).exec().then(...);
如果我对 Mongoose 的假设是错误的,或者如果我的建议都是错误的,请使用相关信息更新您的问题。
关于angularjs - res.send() 在 Node 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44033721/