Hapijs 在从 Node 中的级别数据库返回数据时抛出 'cannot throw non-error object error'
Hapijs throws 'cannot throw non-error object error' when returning data from level db in Node
我一直在努力解决这个问题:
尝试:Return Hapijs 中 GET 请求中来自 levelDB 的数据。
但是得到:
Debug: internal, implementation, error
Error: Cannot throw non-error object
at module.exports.internals.Manager.execute (.../node_modules/hapi/lib/toolkit.js:42:33)
at <anonymous>
首先应该不会有错误。在 Node REPL 环境中检索数据工作正常。通过 POST 请求将数据放入数据库也可以正常工作。
获取和检索数据的 LevelDB 辅助函数:
/** Helper functions to interact with the address levelDB */
const level = require('level');
const addressDB = './adressdata';
const db = level(addressDB);
function addAddressToDB(address) {
return new Promise( (resolve, reject ) => {
db.put(address.toString(), 'valid')
.then( () => resolve('Stored Address.'))
.catch(err => reject(err));
});
}
// Checks how many stars an address still can create
function getAddressInfo(address) {
return new Promise( (reject, resolve) => {
db.get(address.toString())
.then(value => resolve(value))
.catch(err => reject(err));
});
}
module.exports = {
addAddressToDB: addAddressToDB,
getAddressInfo: getAddressInfo
};
Hapijs 服务器配置:
'use strict';
// Basic server setup
const Hapi = require('hapi');
const addressDB = require('./addressdb-utilities');
const server = Hapi.server({
port: 8000,
host: 'localhost'
});
// Helper to Add Address
server.route({
method: 'POST',
path: '/addAddress',
config: {
handler: async (request, response) => {
try {
let address = request.payload.address;
let response = await addressDB.addAddressToDB(address, 'valid')
return response;
} catch(err) { throw new Error(err) }
}
}
});
// Helper to retrieve address
server.route({
method: 'GET',
path: '/address/{address}',
handler: async (request, h) => {
let address = encodeURIComponent(request.params.address);
let status = await addressDB.getAddressInfo(address); // This line causes the error
console.log('Address: ', address);
console.log('Address Type: ', typeof address);
console.log(status);
return 'status';
}
});
// Initialize server
const init = async () => {
await server.start();
console.log(`Server running at: ${server.info.uri}`);
return;
};
// Error handling
process.on('unhandledRejection', (err) => {
console.log(err);
process.exit(1);
});
init();
将所有内容包装在 try/catch 博客中不会导致服务器上没有错误消息,但会根据请求产生代码 500 响应。仅仅解决 err 和 value 也不会改变任何东西。
我非常感谢每一个关于更多调试的提示,以及要尝试的事情。我没有想法,到目前为止研究没有帮助。希望您能找到此处提供的所有信息。
环境:
- 节点版本:8.11.3
- Hapi版本:17.5.3
- 等级版本:4.0.0
- OS:OSX 10.13.6(高山脉)
经过很多很多小时的调试。我意识到 promise 参数的顺序错误...所以拒绝解决,反之亦然。
我一直在努力解决这个问题:
尝试:Return Hapijs 中 GET 请求中来自 levelDB 的数据。 但是得到:
Debug: internal, implementation, error
Error: Cannot throw non-error object
at module.exports.internals.Manager.execute (.../node_modules/hapi/lib/toolkit.js:42:33)
at <anonymous>
首先应该不会有错误。在 Node REPL 环境中检索数据工作正常。通过 POST 请求将数据放入数据库也可以正常工作。
获取和检索数据的 LevelDB 辅助函数:
/** Helper functions to interact with the address levelDB */
const level = require('level');
const addressDB = './adressdata';
const db = level(addressDB);
function addAddressToDB(address) {
return new Promise( (resolve, reject ) => {
db.put(address.toString(), 'valid')
.then( () => resolve('Stored Address.'))
.catch(err => reject(err));
});
}
// Checks how many stars an address still can create
function getAddressInfo(address) {
return new Promise( (reject, resolve) => {
db.get(address.toString())
.then(value => resolve(value))
.catch(err => reject(err));
});
}
module.exports = {
addAddressToDB: addAddressToDB,
getAddressInfo: getAddressInfo
};
Hapijs 服务器配置:
'use strict';
// Basic server setup
const Hapi = require('hapi');
const addressDB = require('./addressdb-utilities');
const server = Hapi.server({
port: 8000,
host: 'localhost'
});
// Helper to Add Address
server.route({
method: 'POST',
path: '/addAddress',
config: {
handler: async (request, response) => {
try {
let address = request.payload.address;
let response = await addressDB.addAddressToDB(address, 'valid')
return response;
} catch(err) { throw new Error(err) }
}
}
});
// Helper to retrieve address
server.route({
method: 'GET',
path: '/address/{address}',
handler: async (request, h) => {
let address = encodeURIComponent(request.params.address);
let status = await addressDB.getAddressInfo(address); // This line causes the error
console.log('Address: ', address);
console.log('Address Type: ', typeof address);
console.log(status);
return 'status';
}
});
// Initialize server
const init = async () => {
await server.start();
console.log(`Server running at: ${server.info.uri}`);
return;
};
// Error handling
process.on('unhandledRejection', (err) => {
console.log(err);
process.exit(1);
});
init();
将所有内容包装在 try/catch 博客中不会导致服务器上没有错误消息,但会根据请求产生代码 500 响应。仅仅解决 err 和 value 也不会改变任何东西。
我非常感谢每一个关于更多调试的提示,以及要尝试的事情。我没有想法,到目前为止研究没有帮助。希望您能找到此处提供的所有信息。
环境:
- 节点版本:8.11.3
- Hapi版本:17.5.3
- 等级版本:4.0.0
- OS:OSX 10.13.6(高山脉)
经过很多很多小时的调试。我意识到 promise 参数的顺序错误...所以拒绝解决,反之亦然。