使用await解析Promise遇阻:server.listen报错port为Promise而非数字
问题出在哪?
你踩了async/await的一个常见小坑:所有async函数的返回值都会被自动包装成Promise对象,哪怕你在函数内部用了await!
看你这行代码:
var port = get_port();
这里的port根本不是你期待的端口号,而是get_port()这个async函数返回的未解析Promise,直接传给server.listen()当然会报错啦。
另外,你的get_port函数其实有点冗余——getPort本身就返回Promise,没必要再手动套一层Promise,简化成这样就够了:
const getPort = require('get-port'); const get_port = async () => await getPort({ port: 16100 }); // 甚至更简洁,async函数会自动帮你包装Promise返回值 const get_port = () => getPort({ port: 16100 });
怎么解决?
要拿到真正的端口号,你得处理get_port()返回的Promise,有两种常用方法:
方法1:在另一个async函数里用await
把启动服务器的逻辑放到一个async函数里,这样就能用await获取解析后的端口:
async function startServer() { try { const port = await get_port(); server.listen(port); console.log(`服务器跑在端口 ${port} 啦!`); } catch (err) { console.error('获取端口失败:', err); } } startServer();
这里加了try/catch是为了处理可能的错误(比如指定端口被占用),让程序更健壮。
方法2:用.then()链式调用
如果不想多写一个async函数,直接用Promise的.then()也能搞定:
get_port() .then(port => { server.listen(port); console.log(`服务器跑在端口 ${port} 啦!`); }) .catch(err => { console.error('获取端口失败:', err); });
小提醒
不管用哪种方式,都别忘了处理错误哦!毕竟getPort可能会因为端口被占用等原因抛出异常,提前处理能避免程序崩溃。
内容的提问来源于stack exchange,提问作者Joshua M. Moore
相关产品推荐
相关产品推荐

