angularjs - res.send() 在 Node 中不起作用

标签 angularjs node.js

我正在使用 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/

相关文章:

javascript - D3 - 制作一个有错误的简单圆环图

angularjs - 升级到 1.6 后,不显示 Angular 错误消息

node.js - 由 bcrypt 引起的无效 ELF header

node.js - 在nodejs中按属性过滤对象

angularjs - Angular 依赖注入(inject) - 我一直看到两种不同的方法

html - 如何禁用 AngularJs 中另一个选定值的按钮

javascript - 使用 ng-repeat 重复 Google Chart 图表

html - AngularJS 显示 MongoDB 数据

sockets - 我可以在 heroku 上设置 socket.io 聊天吗?

node.js - 在 Jenkins 中运行 grunt 时无法解析的 NodeJS 安装程序