节点服务器以调试模式返回数据但不是以实时模式

时间:2018-02-09 15:03:07

标签: node.js

当我在调试模式下运行我的节点服务器,并从GET请求执行下面的get函数时,它返回我预期的大约500ms的数据。如果我在实时模式下运行服务器并执行相同的操作,则无法响应。

如果我类似地访问getTime函数,在调试模式下我得到大约300ms的有效数据,但在实时模式下我得到一个空字符串。

我有一种感觉,问题在于我如何处理异步,因为调试模式运行速度比实时模式慢一点,但这也意味着我无法在调试模式下对此进行故障排除。

var storage = require('../services/storage');

module.exports = {
  get: async function(req, res){
    console.log('request received.');
    let data = await getClientData();      
    let clientData = JSON.parse(data);
    if (clientData){
      console.log('returning data.');
      res.send(clientData);
    }
  }, 
  getTime: async function(req, res){
    console.log('Getting time from storage');
    let data = await getClientData(); 
    let time = JSON.parse(data).time;
    console.log('getTime: ', time);
    res.send(time);
  }
}

async function getClientData(){
  return await storage.get('clientData');
}

存储模块:

if (typeof localStorage === "undefined" 
|| localStorage === null) {
  var LocalStorage = 
    require('node-localstorage').LocalStorage;
  localStorage = new LocalStorage('./scratch');
}

module.exports = {
  get: async function(key){
    try {
      console.log('pulling from storage');
      let data = await localStorage.getItem(key);
      if (data !== null && data !== ''
      && typeof data !== 'undefined') {
        console.log('data has been pulled');
        return data;
      } else {
        return false;
      }
    } catch (error) {
      console.error(
        'Unable to get ' + key + ' from localStorage!'
      );
      console.log(error);
    }
    console.log('the localstorage if statement failed to run');
  },
  set: function(key, value){
    try {
      console.log('Saving to localStorage');
      let objectToStore = {
        data: value,
        time: new Date()
      };
      let stringToStore = 
        JSON.stringify(objectToStore);
      localStorage.setItem(
        key, 
        stringToStore
        );
    } catch (error) {
      console.error(
        'Error while saving to localStorage!'
      );
      console.error(error);
    }
  }
}

我在一些控制台语句中添加了帮助跟踪流程,并根据评论进行了一些更改。还有同样的问题。根据控制台输出,看起来getTime函数正在进行而不等待存储模块的get函数返回。

调试控制台输出(两个示例都调用getTime函数):

Getting time from storage
pulling from storage
data has been pulled
getTime:  2018-02-09T14:12:05.141Z

实时控制台输出:

Getting time from storage
pulling from storage
getTime:  undefined

1 个答案:

答案 0 :(得分:0)

node-localstorage模块在调试模式下使用不同的位置。在调试模式下,它保存到与package.json文件相同的路径,但在实时模式下,它使用server.js文件的路径。

我之所以将空字符串作为响应,是因为我测试的数据是在调试模式下构建的,并且在实时模式使用的路径中不存在。

以实时模式构建数据解决了这个问题。