如何用Node.js从MongoDB取数据并推入数组?500错误求助
问题分析与解决
核心错误原因
你代码里的500错误是因为错误操作了Express的响应对象res:你尝试调用res.users.push(),但res是Express框架的响应实例,它本身并没有users这个属性,调用不存在属性的push方法会触发TypeError,进而进入catch块返回500状态码。
修正后的代码示例
//-----login ui form----- router.get("/user/login", function (req, res) { res.render("users/login.ejs"); }); //------ Post --- router.post("/user_secret", async (req, res) => { const email = req.body.username; console.log(email); // 用let声明局部变量,避免全局污染 let users = []; try { const user = await User.findOne({ USER_SECRET: email }); if (!user) { return res.status(404).send("Inputs are Incorrect Information"); } // 往自己定义的users数组push数据,而非res对象 users.push({ username: user.USER_SECRET, password: user.PASS_SECRET, }); // 这里可以添加后续逻辑,比如渲染页面或返回JSON // 示例1:渲染页面并传递users数组 res.render("users/addOrEdit", { users }); // 示例2:返回JSON格式的用户数组 // res.json(users); } catch (e) { // 打印错误信息到控制台,方便排查 console.error(e); res.status(500).send("服务器内部错误"); } });
关于你的疑问
是否需要用map方法?
不需要。map方法用于对数组的每个元素进行转换并返回新数组,而你这里只是将单个查询到的用户对象转成新格式后推入数组,直接用push就足够。如何检查users[]数组是否有数据?
- 控制台打印:在push操作后添加
console.log(users),查看终端/控制台的输出内容; - 长度判断:用
if (users.length > 0)来判断数组是否包含数据; - 前端验证:如果是将数组传递给模板或返回给前端,可以在对应位置打印或渲染数组内容进行验证。
- 控制台打印:在push操作后添加
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

