Express API获取与参数匹配的所有SQLite元素返回未定义

时间:2018-08-22 07:30:58

标签: javascript api express

我有许多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));
    });
  });
};

URL屏幕截图

URL screenshot

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

似乎您的代码中的字符串文字模板有问题。我相信您想根据cardId值搜索图块。

tilesRouter.param('cardId', (req, res, next, cardId) => {
  console.log('cardId: ', cardId);
  const sql = 'SELECT * FROM tile WHERE card_id = $cardId';

因此要注入cardId变量,您必须使用模板文字:

const sql = `SELECT * FROM tile WHERE card_id = ${cardId}`;

注意区别:

  • 模板字符串用反引号(``)而不是双引号或单引号引起来。
  • 模板字符串可以包含占位符。这些由美元$符号和大括号{}
  • 表示

了解更多here