首页 > 解决方案 > 用于获取与参数匹配的所有 SQLite 元素的 Express API 返回未定义

问题描述

我有许多 API 可以完全按照它们应该的方式工作,并且可以毫无问题地获取和发布。但是,当我尝试根据参数获取所有记录时,我得到未定义的响应。更令人沮丧的是,如果我在浏览器中输入搜索字符串,我会得到预期的响应。

API 片段

tilesRouter.param('cardId', (req, res, next, cardId) => {
  console.log('cardId: ', cardId);
  const sql = 'SELECT * FROM tile WHERE card_id = $cardId';
  const values = {$cardId: cardId};
  console.log('param sql: ', sql);
  console.log('param values: ', values);
  db.all(sql, values, (error, tile) => {
    if (error) {
      next(error);
    } else if (tile) {
      console.log('param req:tile: ', req.tile);
      req.tile = tile;
      next();
    } else {
      res.sendStatus(404);
    }
  });
});

tilesRouter.get('/:cardId', (req, res, next) => {
  res.status(200).json({tile: req.tile});
});

实用程序片段

Bingo.getTiles = card_id => {
  const url = `${baseUrl}/tiles/${card_id}`;

  return fetch(url).then(response => {

    if (!response.ok) {
      return new Promise(resolve => resolve([]));
    }

    return response.json().then(jsonResponse => {
      console.log('jsonResponse: ', jsonResponse); // empty
      return jsonResponse.tiles.map(tile => camelcaseKeys(tile));
    });
  });
};

网址截图

网址截图

标签: javascriptapiexpress

解决方案


我认为问题是如何传递参数。如果我将 SQL 语句硬编码为'SELECT * FROM tile WHERE card_id = 26'而不是'SELECT * FROM tile WHERE card_id = $cardId',则该过程有效。我要弄清楚我在参数值上做错了什么,现在我知道 SQL 语句和 API 确实在工作。


推荐阅读