使用Express.js向MongoDB插入数据时出现空值问题排查
问题分析与修复方案
你的代码核心问题是异步操作执行顺序错误:axios.get是异步任务,你在发起请求后立刻就创建了RecruitModel实例,此时请求还未返回数据,initialData仍是初始的空对象,所以插入MongoDB的自然是空值。
修复后的代码(两种可选写法)
写法1:用async/await统一处理异步逻辑
这种写法更直观,确保拿到数据后再执行后续操作:
app.get('/', async (req, res) => { try { // 等待Flask API返回数据 const response = await axios.get('http://localhost:3000/details'); const initialData = response.data; // 基于获取到的数据创建模型实例 const recruit = new RecruitModel({ email: initialData.email, mobile_number: initialData.mobile_number, name: initialData.name }); await recruit.save(); res.send("inserted data"); } catch (error) { console.log(error); res.status(500).send("Failed to insert data"); // 增加错误状态响应 } })
写法2:调整Promise回调的执行位置
将创建模型和保存的逻辑放到axios.get的then回调内,保证在拿到数据后执行:
app.get('/', (req, res) => { axios.get('http://localhost:3000/details') .then((response) => { // 注意:原代码里回调参数用了res,会覆盖路由的res对象,这里改成response避免冲突 const initialData = response.data; const recruit = new RecruitModel({ email: initialData.email, mobile_number: initialData.mobile_number, name: initialData.name }); return recruit.save(); }) .then(() => { res.send("inserted data"); }) .catch((error) => { console.log(error); res.status(500).send("Failed to insert data"); }); })
额外提示
- 可以在获取数据后增加字段校验,比如判断
initialData.email等字段是否存在,避免因Flask API返回格式异常导致的错误。 - 原代码中axios回调的参数名
res和路由的响应对象res重名,会覆盖外层变量,修复后的代码已修正这个问题。
内容的提问来源于stack exchange,提问作者Moudhaffer Bouallegui
相关产品推荐
相关产品推荐

