当我在调试模式下运行我的节点服务器,并从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
答案 0 :(得分:0)
node-localstorage模块在调试模式下使用不同的位置。在调试模式下,它保存到与package.json文件相同的路径,但在实时模式下,它使用server.js文件的路径。
我之所以将空字符串作为响应,是因为我测试的数据是在调试模式下构建的,并且在实时模式使用的路径中不存在。
以实时模式构建数据解决了这个问题。