404在提出表达路线的请求时

时间:2017-05-03 16:40:50

标签: javascript node.js ajax express fetch

我想了解express以及它如何处理路线。

我设置了具有以下结构的域名

/
  app.js
    /public_html
      index.html

在app.js中,我设置了我的快速服务器:

let app = express();

app.post('/list', (request, response) => {
  //get data then...
  response.send(data)
});

app.use(express.static('public_html'))

app.listen(3000, function(){
  console.log('listening');
});

我使用node app.js

运行应用

然后,在public_html目录的index.html中,我正在尝试请求数据。我只是做了一个简单的事情:

fetch('/list').then(function(response) {
  console.log(response)
})

但我得到404作为回应。

我对一些事情感到有些困惑:

  1. 默认情况下,我的Web服务器(Apache / Ubuntu)设置为从public_html目录中提供html。这是否意味着我需要将整个节点应用程序结构移动到public_html文件夹中,并将实际的html移动到static文件夹中?

  2. 港口怎么样?节点应用程序侦听端口3000 - 但我不确定如何(或是否)专门向该端口发出请求。

  3. 路径路径 - 我发布到/list但应该是../list吗?

  4. 我还没有找到适用于此应用的配置。任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:3)

使用以下代码。使用ajax而不是fetch,方法必须是POST。由于默认情况下获取请求,因此提取无法正常工作。

选项1

    $.ajax({
       method: "POST",
       url: "/list"
      })
     .done(function( msg ) {
      alert( "Data " + msg );
  });

选项2 仅在代码后更改=> POST到GET

app.get('/list', (request, response) => {
  //get data then...
  response.send(data)
});

选项3 在提取中使用POST

fetch("/list",
{
    method: "POST"
})
.then(function(data){  alert( "Data " + data ); })

感谢@ vesse建议选项3

https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch

答案 1 :(得分:1)

  

默认情况下,我的Web服务器(Apache / Ubuntu)设置为从public_html目录中提供html。这是否意味着我的整个节点应用程序结构需要移动到public_html文件夹中,而实际的html是否会移动到静态文件夹中?

Node.js和Apache可以使用相同的静态文件夹而不会发生冲突,但它们都无法在同一端口上侦听。您的Apache服务器可能已经在端口80上运行。如果您的Node.js服务器在端口3000上运行,对端口80的请求将与您在应用程序中写入的路由不匹配,因此404将返回(除非您具有相同的单独的Apache托管应用程序中的路由。)

  

港口怎么样?节点应用程序侦听端口3000 - 但我不确定如何(或是否)特别向该端口发出请求。

由于Apache可能已经在端口80上侦听,因此您发送给http://localhost的任何请求都将命中您的Apache服务器。相反,您必须发出包含端口号的请求,http://localhost:3000将命中您的Node.js服务器。

  

路径路径 - 我发布到/ list但是应该是../list吗?

不,您应该发布到/列表,并且还要考虑Rakesh在他的回答中做出的所有要点,以便您正确地将POST与POST从客户端匹配到服务器或切换到GET,如果这更合适的话。与第二点一样,请确保您要发布到http://localhost:3000而不只是http://localhost。正如您所指出的,一个是Apache,另一个是Node.js

最后,这是我从应用程序脚本旁边的文件夹提供的静态服务器代码行:

app.use('/', express.static(__dirname + '/public_html'));

这样,您放在public_html文件夹中的所有文件都可以在您的应用程序中导航,其中包括Apache相关的所有内容。注意__dirname始终是运行当前正在执行的脚本的目录。要访问此网站,只需转到浏览器中的http://localhost:3000即可看到您的索引文件。