You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:55:26