javascript - 为什么 Express (Node.js) 请求对象是只读的?

标签 javascript node.js express passport.js

我正在使用 PassportJS,但希望前端客户端可以使用用户 ID (_id)。因此,我尝试将 _id 拼接到 req.user.userInfo 对象中:

/** Create user */
exports.create = function (req, res, next) {
    var newUser = new User(req.body);
    newUser.provider = 'local';

    newUser.save(function(err) {
        if (err) {
            // Manually provide our own message for 'unique' validation errors, can't do it from schema
            if(err.errors.email.type === 'Value is not unique.') {
                err.errors.email.type = 'The specified email address is already in use.';
            }
            return res.json(400, err);
        }
        // Login after registration
        req.logIn(newUser, function(err) {
            if (err) return next(err);

            // Splice in _id
            req.user.userInfo['_id'] = req.user['_id'];
            console.log('newUser', req.user, req.user.userInfo);

            return res.json(req.user.userInfo);
        });
    });
};

但是,返回的 JSON 中不存在 _id。对象可以是只读的吗?

<小时/>

更新: console.log 的输出:

newUser { __v: 0,
  name: 'tom@myemail.com',
  hashedPassword: '$2a$10$r9ZL1JerqDko8zw72q5J5ONYZAWDpHDF1ROt0k35/1fRgfqNedGWG',
  salt: '$2a$10$r9ZL1JerqDko8zw72q5J5O',
  provider: 'local',
  email: 'tom@myemail.com',
  _id: 534552e8ecb0d69648000003,
  role: 'user' } { name: 'tom@myemail.com', role: 'user', provider: 'local' }

最佳答案

好的,第二个理论:虽然 req 是一个普通的 javascript 对象,但 req.user 是一个 mongoose.js 模型实例。 Mongoose 有一些神奇的功能,即虚拟属性以及 toObjecttoJSON 期间的转换。我怀疑 req.user.userInfo 可能是 mongoose 虚拟的,这就是为什么对它的修改会被忽略,因为每次访问 req.user.userInfo 时 mongoose 都会重新生成该值。

如果这是真的(我的证据是指示 mongoose 的 __v 属性,您可以通过这样做来解决它:

        // Splice in _id
        var userInfo = req.user.userInfo;
        userInfo._id = req.user._id;
        console.log('newUser', req.user, userInfo);

        return res.json(userInfo);

对于您更大的问题,req 对象不是只读的。您的代码中存在一些更简单的错误。

旁白:_id 是一个有效的标识符,因此您应该只使用普通的点语法,但方括号语法是等效的。

关于javascript - 为什么 Express (Node.js) 请求对象是只读的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22965186/

相关文章:

javascript - Swagger-Codegen:如何将所有文件合并到一个文件中以进行客户端代码生成

javascript - DevExpress的DevExtreme for Angular2及预选

javascript - 不应用具有不同标题的 CSS 样式表 - 即使没有 rel ="alternative"

javascript - 使用 jquery 构建元素层次结构

javascript - 将 React + NodeJS + Express + MySQL 应用程序部署到 Heroku 只部署服务器而不是 React

node.js - Mongoose .find 查询结果包含查询元数据?不能只手动投影集合的每个属性,如何只获取文档?

node.js - Hapi/Joi 验证错误日志

node.js - process.env 变量即使在导出后也未定义

javascript - 序列化后如何通过post发送数据?

mysql - 如何在nodejs中处理Promise