2017-3-15:新增 node 服务转发 api 请求javascript
2017-3-17:增长在线访问地址,node 服务转发 api 请求部署到 herokucss
clone项目到本地,进入项目文件夹,安装依赖html
git clone https://github.com/superman66/vue2.x-douban.git cd vue2.x-douban npm install
而后运行项目前端
npm run dev
接着运行 node,启动服务vue
cd node-proxy node index.js //启动成功后,将看到输出 // HTTP Server is running in http://127.0.0.1:8081
最后打开浏览器,输入localhost:8880
便可访问。效果图以下:java
戳我查看 demonode
注意:因为heroku在国外,并且我用的是免费版,当长时间没有链接的话,node服务会被休眠。若是处于休眠状态下,用户访问速度会比较慢,还有可能出现接口请求出现错误。遇到这种状况,刷新重试便可。webpack
应用包括下面4个路由ios
/movies
首页,包含正在上映榜单和即将上映榜单的电影信息,首页只显示各个榜单的前8条数据;git
/movie-list
榜单列表页面,显示榜单列表信息;
/movie/subject/:id
电影详情页面;
/movie/search
电影搜索列表页面。
. ├── README.md ├── build // vue-cli 自带的配置文件 │ ├── build.js │ ├── check-versions.js │ ├── dev-client.js │ ├── dev-server.js │ ├── utils.js │ ├── webpack.base.conf.js │ ├── webpack.dev.conf.js │ └── webpack.prod.conf.js ├── config // vue-cli 自带的配置文件 │ ├── dev.env.js │ ├── index.js │ └── prod.env.js ├── git.sh ├── index.html ├── node-proxy // node 转发API请求,解决跨域问题 │ └── index.js ├── package.json ├── src │ ├── App.vue │ ├── assets │ │ ├── list.scss │ │ ├── logo.png │ │ ├── search-btn.png │ │ └── style.scss │ ├── components │ │ ├── Hello.vue │ │ ├── Spinner.vue │ │ └── header.vue │ ├── main.js // 入口文件 │ ├── router.js // 路由 │ ├── store │ │ ├── api.js // 抽取访问api的方法 │ │ ├── modules │ │ │ └── movie.js │ │ ├── store.js │ │ └── types.js │ └── views │ ├── index.vue │ ├── movie │ │ ├── movie-detail.vue │ │ ├── movie-list.vue │ │ ├── movies.vue │ │ └── search-list.vue │ └── vuex-demo.vue ├── static └── tree.md
HTTP库采用了axios。
列表下拉加载更多数据使用了vue-infinite-scroll
该应用使用了下面4个api:
/v2/movie/search?q={text}
电影搜索api;
/v2/movie/in_theaters
正在上映的电影;
/v2/movie/coming_soon
即将上映的电影;
/v2/movie/subject/:id
单个电影条目信息。
更多关于豆瓣的api能够前往豆瓣api官网查看。
须要注意的是,因为豆瓣api的跨域问题,并不能直接经过ajax请求访问。不过vue-cli提供了代理的配置。
咱们须要在/config/index.js
中配置代理:
dev: { env: require('./dev.env'), port: 8880, assetsSubDirectory: 'static', assetsPublicPath: '/', proxyTable: { '/api': { target: 'http://api.douban.com/v2', changeOrigin: true, pathRewrite: { '^/api': '' } } }, cssSourceMap: false }
在proxyTable
这个属性中,配置target属性为咱们要代理的目标地址。这里咱们写成http://api.douban.com/v2
,这样咱们就能够在应用中调用/api/movie/in_theaters
来访问http://api.douban.com/v2/movie/in_theaters
,从而解决跨域的问题。
关于vue-cli更多关于跨域的设置能够看官网文档
因为有同窗在问,项目执行npm run build
打包以后,豆瓣 API 代理配置不起做用,没法访问豆瓣API的问题。
因此新增了Node.js http服务,用于转发API请求,解决跨域问题。
安装依赖
Node.js转发用到了 express
和superagent
. superanget是一个 Node.js HTTP client。
npm i express superagent -S
定义接口
根据前端所需,定义了以下三个接口:
app.get('/movie/:type', function (req, res) { var sreq = request.get(HOST + req.originalUrl) sreq.pipe(res); sreq.on('end', function (error, res) { console.log('end'); }); }) app.get('/movie/subject/:id', function (req, res) { var sreq = request.get(HOST + req.originalUrl) sreq.pipe(res); sreq.on('end', function (error, res) { console.log('end'); }); }) app.get('/movie/search', function (req, res) { var sreq = request.get(HOST + req.originalUrl) sreq.pipe(res); sreq.on('end', function (error, res) { console.log('end'); }); })
CORS设置
跨源资源共享 ( CORS )机制让Web应用服务器能支持跨站访问控制,从而使得安全地进行跨站数据传输成为可能。
主要是经过设置Access-Control-Allow-Origin: *
app.all('*', function (req, res, next) { if (!req.get('Origin')) return next(); // use "*" here to accept any origin res.set('Access-Control-Allow-Origin', '*'); res.set('Access-Control-Allow-Methods', 'GET'); res.set('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type'); // res.set('Access-Control-Allow-Max-Age', 3600); if ('OPTIONS' == req.method) return res.send(200); next(); });
端口监听
app.listen(8081, function () { console.log('HTTP Server is running in http://127.0.0.1:8081') })
启动
cd node-proxy node index.js
具体见node-proxy/index.js
更多关于 Node.js 转发 api 请求,请戳完整项目:node-proxy-api
若是你想了解vuex的用法,能够切换到vuex
分支,在该分支下,全部的state都采用vuex来管理。