【发布时间】:2013-12-05 03:30:24
【问题描述】:
我是 node.js 的新手。我想要达到的目标如下:
- 连接到我的 postgresql 数据库并获取三个地方的信息(id、坐标)。 对于我需要的每个地方:
- 调用天气API,使用上一步获得的坐标获取该地点的信息。
- 在数据库中插入返回的 json。我得到 8 个每小时的对象,每 3 小时(0、3、6、9、12、15、18、21)有天气信息。我需要遍历这些对象并将它们存储在数据库中的 8 条记录中。
我写了以下代码:
app.get('/getapi', function(req, res, next){
//------------ BBDD CONNECTION----------------
pg.connect(conString, function(err, client, done) {
if(err) {
// example how can you handle errors
console.error('could not connect to postgres',err);
return next(new Error('Database error'));
}
client.query('SELECT * from places where id>3274 and id<3278', function(err, result) {
if(err) {
console.error('error running query',err);
done();
return next(new Error('Database error'));
}
var first_callback = 0;
for (var y=0; y<result.rows.length; y++) {
var coords = JSON.parse(result.rows[y].json).coordinates;
var id = result.rows[y].id;
var input = {
query: coords[1] + ',' + coords[0] ,
format: 'JSON',
fx: ''
};
var url = _PremiumApiBaseURL + "marine.ashx?q=" + input.query + "&format=" + input.format + "&fx=" + input.fx + "&key=" + _PremiumApiKey;
request(url, function(err, resp, body) {
body = JSON.parse(body);
if (!err && resp.statusCode == 200) {
var date = body.data.weather[0].date;
var callbacks = 0;
for (var i=0; i < 8; i++) {
var hourly = body.data.weather[0].hourly[i];
client.query(
'INSERT into parte (id, date, time) VALUES($1, $2, $3)',
[id, date, hourly.time],
function(err, result) {
if (err) {
console.log(err);
} else {
console.log('row inserted: ' + id + ' iteration ' + i);
}
callbacks++;
if (callbacks === 8) {
console.log('All callbacks done!from id '+id);
//done(); // done(); is rough equivalent of client.end();
//res.send("done");
}
});
} // FOR
}
else { // if the API http request throws an error
console.error(err);
done(); // done(); is rough equivalent of client.end();
return next(new Error('Http API error'));
}
}); // REQUEST API URL
first_callback++;
if (first_callback === result.rows.length-1) {
console.log('All global callbacks done!');
done(); // done(); is rough equivalent of client.end();
res.send("done");
}}
}); // SELECT from pg
}); // CONNECT to pg
}); // app.get
我不知道为什么它尝试插入 id=3277 三次而不是插入 id=3275、id=3276 然后 id=3277... 它的作用是:它插入前 8 条记录 ok第一次(id = 3277),但随后它抛出一个错误,说记录已经插入(主键= id,日期,时间),id 3277...
似乎首先执行第一个 FOR 的 3 次迭代,然后执行第二个 FOR 的 3 次迭代,但使用最后一次迭代(位置)的信息。不是很懂。。。
【问题讨论】:
-
你在哪里看到它试图插入 id
3277三次?你问这个问题时有没有漏掉什么? -
我通过代码写了一些console.logs,看看它在做什么以及以什么顺序发生了什么
-
我想了这么多,我只是想提请你注意,如果你想提一些你应该在你的问题正文中包含该信息的内容。我的回答可能会对您的问题有所启发。
标签: database node.js postgresql for-loop insert