4

我有带有子系统 Linux(Ubuntu-20.04)的 Windows 10,我正在使用 WSL2。当我初始化前端项目(vue 项目)并运行时npm run serve,一切正常。正如我所料,该应用程序在 localhost:8080 上运行。但是当我为这个应用程序创建后端(使用 nodejs 的新项目,express)我启动了简单的服务器并且在终端中看起来不错但是当我想在浏览器中进入 localhost:5000 以查看基本的 Hello World 时,页面正在加载一段时间然后说网页本地主机没有发送任何数据。

这是我的 app.ts

import express, { Application, Request, Response, NextFunction } from 'express'
import bodyParser from 'body-parser'
import cors from 'cors'
import 'reflect-metadata'

const app: Application = express()
const port = 5000

app.use(cors)
app.use(bodyParser.json({ limit: '20480kb' }))

app.get('/', (req, res) => {
    res.send('Hello!')
})

const server = app.listen(port, 'localhost', () => console.log(`The server is running on port ${port}.`))

这是我的 package.json 脚本(将 typescript 编译为 javascript 可以正常工作):

"scripts": {
    "start": "nodemon dist/app.js",
    "build": "rm -rf dist/ && tsc -w",
    "commit": "npx git-cz"
  }

这是我的后端终端,这里一切正常:

https://i.stack.imgur.com/pJIb9.png

我尝试使用 netstat 查看连接:

https://i.stack.imgur.com/n5naM.png

我的问题是我无法通过网络浏览器访问服务器,请帮助。

4

3 回答 3

2

如果您明确定义 PORT 工作,我在尝试运行基本节点时遇到同样的问题 - 在 WSL2 上表达应用程序。基本上是网络问题,所以定义 PORT 和 HOST 为我解决了这个问题。这是代码。

const express = require('express');
const app = express();
const PORT = 3000;
const HOST = '0.0.0.0';

app.get('/', (req, res) => res.send('hello world'));
app.listen(PORT, HOST, () => console.log('server running'));

当我将 localhost:3000 放在我的浏览器上时,它可以工作。

出于某种原因,当我更新 docker 桌面时,此方法失败了。另一个有效的解决方案是在 windows 中打开端口。在具有管理员权限的 powershell 中:

netsh interface portproxy add v4tov4 listenport=3000 listenaddress=0.0.0.0 connectport=3000 connectaddress=192.168.x.x

在“connectaddress”中,您必须输入您的 IP(wsl2),您可以使用 ifconfig 获取它

于 2020-10-07T14:01:16.963 回答
0

我的第一个想法是您遇到了 NAT'd WSL2 接口的问题(与默认桥接的 WSL1 相反),但这不太适合您的问题,因为:

  1. 您似乎建立了连接,但没有数据。如果它一开始没有连接,您只会从浏览器中获得“连接被拒绝”。

  2. 无论如何,本地主机不应该对 NAT 有任何问题。

我不是 Express 方面的专家,但我认为您所看到的可能与您在这里使用的中间件有关。我相信要使 body-parser 工作,您可能需要解析 POST,但您的代码(和浏览器访问)仅提供 GET 方法。有关更多详细信息,请参阅此问题/答案

我认为您需要提供一个 POST 方法,并且您需要使用 Postman 或 curl 之类的东西进行测试。

如果您只需要排除任何 WSL2 问题,请尝试Express "Hello, World"

于 2020-08-16T21:01:46.057 回答
0

您不需要在 Windows 端创建输入规则并打开该端口吗?进入安全高级设置并创建一个允许端口 5000 通过的输入规则。我正在使用 Windows 10 和 WSl2,并使用 NodeJS 和 Express——这就是我正在做的事情并且它可以工作。

于 2021-01-09T20:52:07.117 回答