在快递服务器上写完结束错误

时间:2018-04-11 08:46:03

标签: javascript jquery node.js ajax express

我正在完成一项学校作业,我们需要编写一个客户端 - 服务器应用程序。更具体地说,应该能够使用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

1 个答案:

答案 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