从运行在不同端口的 Vue 应用程序调用 node express 服务器 API

Posted

技术标签:

【中文标题】从运行在不同端口的 Vue 应用程序调用 node express 服务器 API【英文标题】:Calling node express server API from Vue application running in a different port 【发布时间】:2018-03-29 06:24:59 【问题描述】:

我最近开始学习 vue.js,目前使用 vue.js 和 vue-simple-webpack 模板、express 和 mongo 开发一个简单的应用程序。我正在使用 localhost 来开发和测试应用程序。

应用程序前端运行在端口 8080 而服务器运行在不同的端口 (3000)

这是我的server.js,我有一个简单的 api 从我的localdb 获取数据

const express = require('express');
const MongoClient = require('mongodb').MongoClient;
const mongodb = require('mongodb');
const bodyParser= require('body-parser');
const app = express();
var db;

var URL='mongodb://localhost:27017/'+'mydb';
console.log(URL);

app.use(express.static(__dirname + '/public'));
app.use(bodyParser.urlencoded(extended: true))
app.use(bodyParser.json())

MongoClient.connect(URL, (err, database) => 
  if (err) 
    return console.log(err);
  db = database;
  app.listen(3000, () => 
    console.log('listening on 3000');
  )
)

app.get('/products', (req, res) => 
    db.collection('products').find().toArray(function(err, results) 
    console.log(results)
    res.setHeader('Content-Type', 'application/json');
    res.send(JSON.stringify(results));
    )
)

测试了 server.js ,它可以工作。看下面的截图。

Vue 应用程序使用 webpack 模板的默认配置在 http://localhost:8080/ 中运行。我正在尝试使用 $http get 从 vue.js 文件中调用 /products api 端,如下所示...

export default 
  name: 'Products',
  methods: 
        get: function() 
            // GET request
            this.$http(
                url: '/products',
                method: 'GET'
            ).then(function(response) 
                console.log('ok');
            , function(response) 
                console.log('failed');
            );
        
    

但我在浏览器控制台中收到以下错误。

如您所见,即使我在server.js 中使用端口3000,当我尝试访问/products api 端时,它实际上是通过端口8080。因此它会抛出 404 http 错误。

我的问题是如何从运行在不同端口的前端访问 API 端。这甚至可能吗?

我可以在这里使用API Proxying 吗?如果是这样,由于网络上没有太多可用的信息,有人可以为我指出正确的方向吗?

【问题讨论】:

$http() 应该允许您指定端口。 【参考方案1】:

可以使用 webpack 提供的代理配置。

文档:https://webpack.js.org/configuration/dev-server/#devserver-proxy

sn-p 配置:

proxy: 
  "/products": "http://localhost:3000/products"

更好的做法是将 /api/* 请求转发到 http://host:port/api/* 网址。

【讨论】:

我在 webpack web config 中添加了代理。还像您建议的那样将服务器网址更改为 /api/* 模式。但是当我尝试访问 /api/products 时问题仍然存在。 $http.get 方法尝试从 localhost:8080 端口访问 /api/products 。因此我收到 404 错误 请参考我在我的代码 github 代码库中提出的这个问题。 github.com/mal90/adApp/issues/3 您可以添加以下配置。我刚刚检查了代码并进行了测试。它工作得很好。 :) 代理:“/api/”:目标:“localhost:3000”,安全:假 正确。这样可行 。在我早期的代理解决方案中,我犯了一个错误。谢谢@Saurabh 这太棒了,而且是迄今为止解决整个 CORS 问题的最简单的解决方案。

以上是关于从运行在不同端口的 Vue 应用程序调用 node express 服务器 API的主要内容,如果未能解决你的问题,请参考以下文章

端口错误:heroku 中的 vue.js+node.js 项目

Webpack - 关闭对 /sockjs-node/info 的请求或指定不同的端口

开发环境Vue访问后端代码(前后端分离开发,端口不同下跨域访问)

Node.js - 如何从 url 中删除端口? [关闭]

全栈高级工程师实战 Vue+Node+MongoDB

Vue+Node+MongoDB高级全栈开发