开发Express+Node+PostgreSQL Todo应用,Postman POST报'-'附近语法错误
解决PostgreSQL中
syntax error at or near "-"的问题 你遇到的错误是因为PostgreSQL不允许直接使用带连字符-的表名——它会把todo-list解析成todo减list的运算,直接触发语法错误。以下是两种解决方法:
方法1:给表名添加双引号
修改index.js中的SQL语句,将todo-list用双引号包裹,明确告诉PostgreSQL这是一个完整的表名:
// POST路由修改后 app.post("/todos", async (req, res) => { try { const { description } = req.body const newTodo = await pool.query( `INSERT INTO "todo-list" (description) VALUES($1) RETURNING *`, [description] ); res.json(newTodo.rows[0]) } catch (err) { console.error(err.message) } }) // GET路由修改后 app.get("/todos", async (req, res) => { try { const allTodos = await pool.query('SELECT * FROM "todo-list"') res.json(allTodos.rows) } catch (err) { console.log(err.message) } })
方法2:修改表名为下划线命名(推荐)
更符合SQL命名规范的做法是将表名改为todo_list(用下划线代替连字符),这样无需额外添加引号,代码可读性更强:
// POST路由修改后 app.post("/todos", async (req, res) => { try { const { description } = req.body const newTodo = await pool.query( `INSERT INTO todo_list (description) VALUES($1) RETURNING *`, [description] ); res.json(newTodo.rows[0]) } catch (err) { console.error(err.message) } }) // GET路由修改后 app.get("/todos", async (req, res) => { try { const allTodos = await pool.query("SELECT * FROM todo_list") res.json(allTodos.rows) } catch (err) { console.log(err.message) } })
注意:如果选择修改表名,需要同步在PostgreSQL中修改对应的表名称。
原始代码参考
//db.js
const Pool = require("pg").Pool; const pool = new Pool({ user: 'postgres', host: 'localhost', port: 5432, database: 'crud', password: 'password' }); module.exports = pool
//.env
DATABASE_URL=postgres://postgres:password@localhost:5432/crud

内容的提问来源于stack exchange,提问作者Denyyel
相关产品推荐
相关产品推荐

