Node.js,RESTIFY,Mongoose,Promise:尝试$推送数组更新但不工作

时间:2018-03-16 03:56:45

标签: javascript node.js mongoose restify

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

这是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

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

2 个答案:

答案 0 :(得分: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?

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

我认为你的$push还可以,但你已经说过了

  

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

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

答案 1 :(得分:0)

我尝试清理我的代码

这是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替换它,它起作用了。 如果有差异,或者我想念一些东西,我可以随意指出它。