Node.js使用sqlite3插入数据成功但this.lastID为undefined如何解决
问题原因
- 提前获取ID逻辑错误:你在插入数据库操作执行前就声明
const id = this.lastID,此时插入尚未触发,没有生成行ID,且当前位置的this指向不是sqlite3的执行上下文,必然返回undefined。 - 封装方法未透传lastID:sqlite3的
db.run()方法执行插入成功后,仅在它自身的回调函数内可以通过this.lastID获取新插入行的ID,你当前封装的uploadPost方法只把错误对象传给了上层回调,没有把this.lastID透传出去,上层调用时自然拿不到对应值。 - 上层回调this指向错误:你在业务逻辑的
db.uploadPost回调中直接访问this.lastID,此时的this指向的是外层函数的上下文,不是sqlite3的执行上下文,即使不做透传也拿不到对应值。
修复代码
1. 修改封装的数据库操作代码
exports.uploadPost = function(name, description, Filename, callback){ const query = "INSERT INTO products('name', 'description', 'image') VALUES (?,?,?)" const values = [name, description, Filename] // 注意这里不要把回调写成箭头函数,否则this指向会丢失,拿不到lastID db.run(query,values, function(error){ // 插入无错误时,把lastID作为第二个参数传递给上层回调 callback(error, error ? null : this.lastID) }) }
2. 修改业务逻辑代码
app.post('/products/create', (req,res) => { upload(req, res, (err) => { if (err) { console.log('文件上传失败:', err) return res.status(500).send('文件上传失败') } const name = req.body.name const description = req.body.description const Filename = req.file.filename // 去掉提前获取id的逻辑,从回调参数中拿透传的lastID db.uploadPost(name, description, Filename, function(error, id){ if(error){ console.log('数据库插入失败:', error) return res.status(500).send('数据插入失败') } console.log('新插入数据的ID:', id) res.redirect('/products/'+id) }) }) })
注意事项
db.run的回调必须使用普通函数声明,不能使用箭头函数,箭头函数会绑定外层上下文,导致无法获取sqlite3注入的this.lastID、this.changes等属性。- 建议补全错误分支的返回逻辑,避免请求挂起。
内容的提问来源于stack exchange,提问作者Tamer Khartabil
相关产品推荐
相关产品推荐

