我正在使用express和nodejs为一个家庭作业问题做一个聊天室,我把这些消息保存在一个sql .db文件中。索引具有自动编写的整数主键,还有3列文本信息:room,nickname和body。这是我尝试和调试的一些代码:
app.post('/messages', function(request, response){
if(request.body.username == ''){
var username = "Anonymous";
}
else {
var username = request.body.username;
}
var msg = request.body.msg;
conn.query('INSERT INTO messages(id, room, nickname, body) VALUES ($1, $2, $3, $4);', [n, room1, username, msg]); //room, name, text
var out = conn.query('SELECT body FROM messages WHERE id = 2');
console.log(out);
});
这会输出表格的一堆设置
SQLite3Query {
_readableState:
ReadableState {
objectMode: true,
highWaterMark: 16,
buffer: [],
length: 0,
pipes: null,
pipesCount: 0,
flowing: null,
ended: false,
endEmitted: false,
reading: false,
sync: true,
needReadable: false,
emittedReadable: false,
readableListening: false,
defaultEncoding: 'utf8',
ranOut: false,
awaitDrain: 0,
readingMore: false,
decoder: null,
encoding: null },
readable: true,
domain: null,
_events: {},
_eventsCount: 0,
_maxListeners: undefined,
text: 'SELECT body FROM messages WHERE id = 2',
_fields: null,
_result: { rows: [] },
_errored: false,
values: [],
callback: undefined }
最后一部分" WHERE id = 2"我有点困惑,因为如果我把正常的''在2左右它打破了。
使用其他软件,我可以看到数据库中确实有信息。最后我想让聊天室打印出从适当的房间到HTML的所有索引,但这个障碍存在。
答案 0 :(得分:1)
API Colonel_Thirty_Two指的是:https://github.com/mapbox/node-sqlite3/wiki/API
部分:Database#all(sql, [param, ...], [callback])
正是您要找的。通过查看函数签名,我们看到我们需要指定一个SQL查询,后跟两个可选参数,一个是回调函数。
此外,在描述中我们看到回调需要采用以下形式:function(err, rows)
。其中err
是一个为null的对象,除非出现错误。 rows
是你的实际行。
把它们放在一起我们得到:
var query = 'SELECT body FROM messages WHERE id = 2';
conn.all(query, function(err, rows) {
console.log(rows);
}
使用param可选参数我们可以:
var query = 'SELECT body FROM messages WHERE id = ?';
conn.all(query, 2, function(err, rows) {
console.log(rows);
}
如果键是整数,则WHERE id = 2应该可以正常工作。将“”置于2左右将失败,因为SQL中未使用双引号。如果你的主键是一个字符串,你可以在它周围加上单引号。
var query = 'SELECT body FROM messages WHERE id = \'2\'';
conn.all(query, function(err, rows) {
console.log(rows);
}
最后还有一个很好的教程: https://codeforgeek.com/2014/07/node-sqlite-tutorial/