Cloudant 和 Node 调用有时可以正常工作
Cloudant and Node calls working some of the time
这对我来说似乎有点简单,但我有一个 cloudant 数据库,并且正在尝试从每个文档中获取信息。到目前为止,我已经用 js 编写了这个脚本
ciaran.list(function(err, data){
rows=data.rows
//console.log(rows)
for ( row in rows){
id=rows[row].id;
ciaran.get(id,function(err, data){
console.log(data.obj.date)
} )
};
})
所有 'setup' 都正常,因为它 returns 一些数据符合预期> 问题是当我 运行 它时,我得到了一些未定义的回复其余的或只是一条错误消息
ciarans-mbp:CloudantNode cdarcy$ node cloudantSearch.js
2000-02-28
2003-08-21
2004-03-31
2004-02-17
2003-12-12
2003-12-08
2003-09-24
2003-12-03
2003-12-05
2004-07-30
/Users/cdarcy/Documents/onboarding/CloudantNode/cloudantSearch.js:21
console.log(data.obj.date)
^
TypeError: Cannot read property 'obj' of undefined
at /Users/cdarcy/Documents/onboarding/CloudantNode/cloudantSearch.js:21:20
at Request._callback (/Users/cdarcy/Documents/onboarding/CloudantNode/node_modules/cloudant-nano/lib/nano.js:240:7)
at Request.self.callback (/Users/cdarcy/Documents/onboarding/CloudantNode/node_modules/request/request.js:186:22)
at emitTwo (events.js:106:13)
at Request.emit (events.js:191:7)
at Request. (/Users/cdarcy/Documents/onboarding/CloudantNode/node_modules/request/request.js:1081:10)
at emitOne (events.js:96:13)
at Request.emit (events.js:188:7)
at IncomingMessage. (/Users/cdarcy/Documents/onboarding/CloudantNode/node_modules/request/request.js:1001:12)
at IncomingMessage.g (events.js:291:16)
我有一种有趣的感觉,这与异步调用有关,但由于我是 Node 的新手,任何人都可以看到为什么代码对某些人有效但对其他人无效的任何其他原因吗?
提前致谢
您可能超过了给定时间段内的 API 请求数(HTTP 状态代码 429)。如果是这种情况,您可以使用重试插件在出现 429 错误时重试连接:
https://github.com/cloudant/nodejs-cloudant#request-plugins
https://github.com/cloudant/nodejs-cloudant#the-retry-plugin
您对 Cloudant (ciaran.list
) 的第一次调用返回了一个列表文档 ID。然后您将遍历这些文件并执行单独的 GET 请求以获取每个文档的正文。
通过将 include_docs=true
添加到您的第一个 API 调用中,可以在一个 API 调用中实现相同的效果,例如
ciaran.list({include_docs: true}, function(err, data) { ...
data
现在将为返回的每个包含文档正文的 rows
包含一个 doc
属性。
您可能 运行 没有 Cloudant 请求,因为您的 "for loop" 是 运行 大量并行 GET 请求。如果您想控制 Node 代码的 "parallelism",请查看 Async 库。
这对我来说似乎有点简单,但我有一个 cloudant 数据库,并且正在尝试从每个文档中获取信息。到目前为止,我已经用 js 编写了这个脚本
ciaran.list(function(err, data){
rows=data.rows
//console.log(rows)
for ( row in rows){
id=rows[row].id;
ciaran.get(id,function(err, data){
console.log(data.obj.date)
} )
};
})
所有 'setup' 都正常,因为它 returns 一些数据符合预期> 问题是当我 运行 它时,我得到了一些未定义的回复其余的或只是一条错误消息
ciarans-mbp:CloudantNode cdarcy$ node cloudantSearch.js 2000-02-28 2003-08-21 2004-03-31 2004-02-17 2003-12-12 2003-12-08 2003-09-24 2003-12-03 2003-12-05 2004-07-30 /Users/cdarcy/Documents/onboarding/CloudantNode/cloudantSearch.js:21 console.log(data.obj.date) ^ TypeError: Cannot read property 'obj' of undefined at /Users/cdarcy/Documents/onboarding/CloudantNode/cloudantSearch.js:21:20 at Request._callback (/Users/cdarcy/Documents/onboarding/CloudantNode/node_modules/cloudant-nano/lib/nano.js:240:7) at Request.self.callback (/Users/cdarcy/Documents/onboarding/CloudantNode/node_modules/request/request.js:186:22) at emitTwo (events.js:106:13) at Request.emit (events.js:191:7) at Request. (/Users/cdarcy/Documents/onboarding/CloudantNode/node_modules/request/request.js:1081:10) at emitOne (events.js:96:13) at Request.emit (events.js:188:7) at IncomingMessage. (/Users/cdarcy/Documents/onboarding/CloudantNode/node_modules/request/request.js:1001:12) at IncomingMessage.g (events.js:291:16)
我有一种有趣的感觉,这与异步调用有关,但由于我是 Node 的新手,任何人都可以看到为什么代码对某些人有效但对其他人无效的任何其他原因吗?
提前致谢
您可能超过了给定时间段内的 API 请求数(HTTP 状态代码 429)。如果是这种情况,您可以使用重试插件在出现 429 错误时重试连接:
https://github.com/cloudant/nodejs-cloudant#request-plugins
https://github.com/cloudant/nodejs-cloudant#the-retry-plugin
您对 Cloudant (ciaran.list
) 的第一次调用返回了一个列表文档 ID。然后您将遍历这些文件并执行单独的 GET 请求以获取每个文档的正文。
通过将 include_docs=true
添加到您的第一个 API 调用中,可以在一个 API 调用中实现相同的效果,例如
ciaran.list({include_docs: true}, function(err, data) { ...
data
现在将为返回的每个包含文档正文的 rows
包含一个 doc
属性。
您可能 运行 没有 Cloudant 请求,因为您的 "for loop" 是 运行 大量并行 GET 请求。如果您想控制 Node 代码的 "parallelism",请查看 Async 库。