如何定义将Promise返回到Express Route功能的功能?

时间:2018-07-19 01:23:57

标签: javascript node.js express promise node-fetch

我有一个称为“ db_location”的业务级别数据库模块,该模块使用node-fetch模块通过REST API从远程服务器获取一些数据。

**db_location.js** DB LOGIC

const p_conf = require('../parse_config');

const db_location = {
    getLocations: function() {

        fetch(`${p_conf.SERVER_URL}/parse` + '/classes/GCUR_LOCATION', { method: 'GET', headers: {
            'X-Parse-Application-Id': 'APPLICATION_ID',
            'X-Parse-REST-API-Key': 'restAPIKey'
        }})
        .then( res1 => {
            //console.log("res1.json(): " + res1.json());
            return res1;
        })
        .catch((error) => {
            console.log(error);
            return Promise.reject(new Error(error));
        })
    }

};

module.exports = db_location

我需要在Route函数中调用此函数,以便将数据库处理与控制器分开。

**locations.js** ROUTE

var path = require('path');
var express = require('express');
var fetch = require('node-fetch');
var router = express.Router();

const db_location = require('../db/db_location');

/* GET route root page. */
router.get('/', function(req, res, next) {

  db_location.getLocations()
  .then(res1 => res1.json())
  .then(json => res.send(json["results"]))
  .catch((err) => {
    console.log(err);
    return next(err);
  })
});

我运行http://localhost:3000/locations时收到以下错误。

Cannot read property 'then' of undefined

TypeError: Cannot read property 'then' of undefined

似乎Promise是空的,还是Promise链中从一个response对象到另一个对象的某些错误?解决这种情况的最佳实践是什么?

编辑1

如果我更改了getLocations以返回res1.json()(根据node-fetch文档,我认为这是一个非空的Promise):

fetch(`${p_conf.SERVER_URL}/parse` + '/classes/GCUR_LOCATION', { method: 'GET', headers: {
        'X-Parse-Application-Id': 'APPLICATION_ID',
        'X-Parse-REST-API-Key': 'restAPIKey'
    }})
    .then(  res1 => {
       return res1.json();     // Not empty as it can be logged to `Promise Object`
    })
    .catch((error) => {
        console.log(error);
        return Promise.reject(new Error(error));
    })

并且路线代码已更改为:

db_location.getLocations()
  .then(json => res.send(json["results"]))
  .catch((err) => {
    console.log(err);
    return next(err);
  })

引发了完全相同的错误。

2 个答案:

答案 0 :(得分:2)

您需要getLocations返回一个Promise。目前,它正在{em>运行一个fetch,但是fetch没有连接任何其他东西,并且getLocations返回了undefined(并且当然您不能在.then上致电uundefined

改为,更改为:

const db_location = {
  getLocations: function() {
    return fetch( ...

此外,由于您在getLocations catch块中没有做任何特别的事情,您可以考虑完全忽略它,并让 caller 处理它。

答案 1 :(得分:0)

您的函数不返回任何内容。

如果您要使用承诺,则需要staff_prefix