我正在完成一项学校作业,我们需要编写一个客户端 - 服务器应用程序。更具体地说,应该能够使用AJAX加载产品的网上商店。我使用jquery,所以我使用$.load()
。
在我的index.js文件(应该显示所有产品的索引页面的路由器)上,我有以下代码应该处理来自AJAX调用的GET请求:
/* GET products on home page. */
router.get('/products', function(req, res, next){
// get search query
var parts = url.parse(req.url, true);
var query = parts.query;
var sortMode = query.sort;
var searchTerm = query.search;
// no search term is present
if (!searchTerm){
// sort by name
if (sortMode === "alphabet"){
db.serialize(function() {
var resdata = "";
db.each("SELECT * FROM Products ORDER BY productname ASC", function(err, row) {
pr = new Product(row.productid, row.productname, row.releasedate, row.publisher, row.genre, row.price, row.stock);
products.push(pr);
resdata = pr.generateProductHtml();
res.write(resdata);
});
res.send();
});
}
});
为了简单起见,我省去了我排序的所有其他模式以及搜索词是否已放入搜索栏,但代码已经在此位代码处抛出错误。
对于earch产品,我使用generateProductHtml()
函数生成一些html代码,然后将该html写入响应。在为每个产品执行此操作之后,我想将完整的html响应发送回客户端,并使用我之前提到的jquery load函数加载此html。
我认为它与res.write(resdata)
和res.send()
都有关系,因为当我省略send函数时,代码似乎没有抛出任何错误,但是没有将响应发送给客户端代码。当我将send()更改为end()时,这似乎没有任何区别。
是否有人知道什么可能导致"写完后#34;我的代码中出错?错误日志没有提供很多信息,除了原因可能在上面这段代码中。
提前致谢!
编辑:
这是运行服务器并加载索引页时控制台提供的错误日志:
GET / 200 1309.069 ms - 2526
GET /stylesheets/style.css 200 4.218 ms - 4827
GET /scripts/adjustNavBar.js 200 12.590 ms - 970
GET /scripts/displayProducts.js 200 0.453 ms - 554
GET /scripts/purchaseButtonScript.js 200 0.789 ms - 282
GET /images/index/banner.jpg 200 1.142 ms - 329313
GET /products?sort=alphabet 200 1.100 ms - -
events.js:183
throw er; // Unhandled 'error' event
^
Error: write after end
at write_ (_http_outgoing.js:625:15)
at ServerResponse.write (_http_outgoing.js:620:10)
at Statement.<anonymous> (D:\Users\Renzo\Documents\GitHub\Client-Server-App\myapp\myapp\routes\index.js:71:15)
at Statement.replacement (D:\Users\Renzo\Documents\GitHub\Client-Server-App\myapp\myapp\node_modules\sqlite3\lib\trace.js:19:31)
at Statement.replacement (D:\Users\Renzo\Documents\GitHub\Client-Server-App\myapp\myapp\node_modules\sqlite3\lib\trace.js:19:31)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! myapp@0.0.0 start: `node ./bin/www "app.js"`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the myapp@0.0.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\Renzo\AppData\Roaming\npm-cache\_logs\2018-04-11T09_04_38_157Z-debug.log
答案 0 :(得分:0)
您需要在完整回调中致电res.end
:
db.each("SELECT * FROM Products ORDER BY productname ASC",
function(err, row) {
pr = new Product(row.productid, row.productname,
row.releasedate, row.publisher, row.genre,
row.price, row.stock);
products.push(pr);
resdata = pr.generateProductHtml();
res.write(resdata);
}, function(err, numberOfRetreivedRows){ res.end(); });
请参阅API docs。