繁体   English   中英

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

[英]Why is the Express (Node.js) request object read-only?

我正在使用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);
        });
    });
};

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


更新: 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.user理论:虽然req是普通的javascript对象, req.userreq.user模型实例。 猫鼬具有一些神奇的功能,即虚拟属性和toObjecttoJSON期间的toObject 我怀疑req.user.userInfo可能是猫鼬虚拟的,这就是为什么对它的修改会被忽略的原因,因为每次访问req.user.userInfo猫鼬都会重新生成值。

如果是这样(我的证据是表示猫鼬的__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是有效的标识符,因此您应该只使用普通的点语法,但方括号语法是等效的。

为什么yelded object '#<object> ' 只读?<div id="text_translate"><p> 我使用 yield 实现了一个简单的搜索 - 通过递归文件夹结构运行,产生所有文件夹。 我的实现相当简单,我删除了所有“const”(以防万一)</p><pre> function *folders(f: Folder): IterableIterator&lt;Folder&gt; { yield f; if (f.folders) { for (let sf of f.folders) { yield* folders(sf); } } } function *allFolders(): IterableIterator&lt;Folder&gt; { for (let p of projects) { yield* folders(p.project.rootFolder!) } }</pre><p> 当我尝试修改返回的 object</p><pre> let folders = allFolders(); let t = folders.next().value; t.name = "sdvs";</pre><p> 我明白了</p><pre>TypeError: Cannot assign to read only property 'name' of object '#&lt;Object&gt;'</pre><p> 如果我直接访问 object (它位于此文件中的全局 scope 中)就可以了。 我现在已经花了几个小时在这上面,我完全感到困惑。 这根本不可能吗? 为什么会发生这种情况?</p></div></object>

[英]Why is yelded object '#<Object>' read-only?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 AJAX请求从node.js / express服务器读取JSON对象 如何使用 node.js 读取发布请求有效负载并表达? Node.js和Express-扩充请求对象是一个好主意吗? 将请求参数与带有node.js和express框架的JSON对象进行匹配 无法从获取请求 Node.js、Express 中获取对象 为什么使用 node.js 和 express 发布请求失败 在 node.js 中导入函数运行单元测试时只读 为什么yelded object '#<object> ' 只读?<div id="text_translate"><p> 我使用 yield 实现了一个简单的搜索 - 通过递归文件夹结构运行,产生所有文件夹。 我的实现相当简单,我删除了所有“const”(以防万一)</p><pre> function *folders(f: Folder): IterableIterator&lt;Folder&gt; { yield f; if (f.folders) { for (let sf of f.folders) { yield* folders(sf); } } } function *allFolders(): IterableIterator&lt;Folder&gt; { for (let p of projects) { yield* folders(p.project.rootFolder!) } }</pre><p> 当我尝试修改返回的 object</p><pre> let folders = allFolders(); let t = folders.next().value; t.name = "sdvs";</pre><p> 我明白了</p><pre>TypeError: Cannot assign to read only property 'name' of object '#&lt;Object&gt;'</pre><p> 如果我直接访问 object (它位于此文件中的全局 scope 中)就可以了。 我现在已经花了几个小时在这上面,我完全感到困惑。 这根本不可能吗? 为什么会发生这种情况?</p></div></object> API Node.js + express,请求有问题 Node.js POST 请求不仅发送对象数组 Object
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM