【问题标题】:Node.js, RESTIFY, Mongoose, Promise: Trying to $push an array to update but not workingNode.js、RESTIFY、Mongoose、Promise:尝试 $push 数组进行更新但不工作
【发布时间】:2018-08-25 01:28:34
【问题描述】:

我使用这种方法是因为我存储了一个分类消息数组,我想形象地理解它为什么不更新。

这是 db.js:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const ObjectId = mongoose.Types.ObjectId;

const usersessionSchema = new Schema({
  fb_id: String,
  fb_name: String,
  fb_profpic: String,
  message_body: [
    {
      message: String,
      message_type: String,
      timestamp: String
    }
  ],
  admin: Boolean,
  branch: String
});

const model = (prefix) => {
    prefix = prefix || '';
    console.log(prefix);
    if (prefix.length > 0) {
        return mongoose.model(prefix + "-usersessions", usersessionSchema);
    } else {
        return new Error('Undefined collection prefix!');
    }
}
/** Push message into message body*/
    module.exports.pushsession =
        async(model, id, data) => {
            return new Promise((resolve, reject) => {
                console.log(data);
                model.findOneAndUpdate({fb_id: id}, {$push: {data}},{safe: true})
                    .then(res => {
                        console.log(res);
                        /
                        resolve(res);
                    })
                    .catch(err => {
                        reject(err);
                        console.log(err);
                        throw err;
                    });
        });
    }

这是controller.js:

/** Push usersession message  */
module.exports.pushsession =
    async(req, res, next) => {
        try {
            //jwt.validateToken(req);
            var en = "en";
            var dateEn = moment().locale(en);

            format = "MM/DD/YYYY h:mm:ss A"; //h:mm:ss.SSS if you want miliseconds

            var datetime_now = dateEn.format(format);

            console.log(datetime_now);

            var request = {

                    message_body: {
                        message: req.body.message,
                        message_type: req.body.message_type,
                        timestamp: datetime_now
                    }
            };

            const model = usersessionDB(req.query['client']);
            const id = req.body.fb_id;
            const result = await usersessionDB.pushsession(model, id, request);
            if (result) {
                response.success(res, next, result, 200, response.HTTP_STATUS_CODES.ok);
            } else {
                response.failure(res, next, {
                    message: 'ID does not exist'
                }, 404, response.HTTP_STATUS_CODES.not_found);
            }
        } catch (err) {
            response.failure(res, next, err, 500, response.HTTP_STATUS_CODES.internal_server_error);
        }
    }

这是 route.js:

const controller = require('../controller/usersession-controller');

module.exports =
    (server) => {
        server.post('/api/session', controller.create);
        server.get('/api/session', controller.list);
        server.get('/api/session/:id', controller.get);
        server.put('/api/session/:id', controller.update);
        server.del('/api/session/:id', controller.delete);
        server.put('/api/pushsession', controller.pushsession);
    }

在视觉上,如果你使用邮递员运行它,你可以看到它显示了我想要搜索和更新的那个

Result of the postman

我想要在那个 message_body 中插入另一组数组

Data I've inserting

My desired output

这段代码在没有承诺的情况下工作,但在我的项目中它是必需的,所以我不能删除那个东西。

【问题讨论】:

    标签: javascript node.js mongoose restify


    【解决方案1】:

    所以,基于:

    这段代码在没有承诺的情况下工作

    我可以指出一两件事,

    db.js

     module.exports.pushsession =
            async(model, id, data) => {
                return new Promise((resolve, reject) => {
    

    你不需要async,因为你返回的是promise,所以替换它

    async(model, id, data) => {

    (model, id, data) => {

    并且由于您要返回 promise 并删除 async ,因此您不需要另一边的 await ( controller.js ),所以这个

     const result = await usersessionDB.pushsession(model, id, request);
                if (result) {
                    response.success(res, next, result, 200, response.HTTP_STATUS_CODES.ok);
                } else {
    

    应该是

    usersessionDB.pushsession(model, id, request).then(
        (result) => { // when resolved
            response.success(res, next, result, 200, response.HTTP_STATUS_CODES.ok);
        }, 
        (err) => { // when rejected
            response.failure(res, next, {
                        message: 'ID does not exist'
                    }, 404, response.HTTP_STATUS_CODES.not_found);
        });
    

    这是async/awaitpromises 之间的比较:Javascript Promises vs Async Await. Difference?

    这里有一些使用承诺的好例子:https://medium.com/dev-bits/writing-neat-asynchronous-node-js-code-with-promises-32ed3a4fd098

    我认为你的$push 没问题,但你已经说过

    这段代码在没有承诺的情况下工作

    我希望这会有所帮助,祝你好运:)

    【讨论】:

    • 泷! :D 我试过删除 await 和 async,但结果还是一样?
    【解决方案2】:

    我尝试清理我的代码

    这是controller.js:

    /** Push usersession message  */
    module.exports.pushsession =
       async (req, res, next) => {
            try {
                //jwt.validateToken(req);
                var en = "en";
                var dateEn = moment().locale(en);
    
                format = "MM/DD/YYYY h:mm:ss A"; //h:mm:ss.SSS if you want miliseconds
    
                var datetime_now = dateEn.format(format);
    
                console.log(datetime_now);
    
                var data = { 
    
                        message: req.body.message, 
                        message_type: req.body.message_type,
                        timestamp: datetime_now
    
                };
    
    
                const model = usersessionDB(req.query['client']);
                const id = req.body.fb_id;
                console.log(id);
                const result = await usersessionDB.pushsession(model, id, data).then(
                    (result) => { // when resolved
                        response.success(res, next, result, 200, response.HTTP_STATUS_CODES.ok);
                    }, 
                    (err) => { // when rejected
                        response.failure(res, next, {
                                    message: 'ID does not exist'
                                }, 404, response.HTTP_STATUS_CODES.not_found);
                    });
            } catch (err) {
                response.failure(res, next, err, 500, response.HTTP_STATUS_CODES.internal_server_error);
            }
        }
    

    这是 db.js:

    const mongoose = require('mongoose');
    const Schema = mongoose.Schema;
    const ObjectId = mongoose.Types.ObjectId;
    
    const usersessionSchema = new Schema({
      fb_id: String,
      fb_name: String,
      fb_profpic: String,
      message_body:[{
          message: String,
          message_type: String,
          timestamp: String
      }],
      admin: Boolean,
      branch: String
    });
    /** Push message into message body*/
    module.exports.pushsession =
    async(model, id, data) => {
        console.log(data);
        return new Promise((resolve, reject) => {
            model.findOneAndUpdate({fb_id: id}, { $push: { message_body: data }})
            .then(res => {
                console.log(res);
                resolve(res);
            })
            .catch(err => {
                reject(err);
                console.log(err);
                throw err;
            });
        });
    }
    

    在我尝试用 $set 替换 $push 然后我再次用 $push 替换它之后,它出乎意料地工作了。 我不知道,如果有区别,或者我遗漏了什么,请随时指出。

    【讨论】:

    • 可能是因为.thenconsole.log()resolve()之间的/,最好在$push(@ 987654328@) 而不是在对象中传递它,并且您在控制器中以正确的方式使用承诺 .then() 而不是我在回答中提到的 result = await ... :) ,但是因为您说代码是在没有promise 的情况下工作,无论如何,我很高兴你得到了这个工作:) (只需将问题标记为已回答并将其中一个答案标记为已接受)
    猜你喜欢
    • 2018-07-30
    • 2014-03-28
    • 2023-01-29
    • 2017-01-19
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2011-06-24
    相关资源
    最近更新 更多