轉載自:
https://blog.csdn.net/weixin_39728230/article/details/80293892
https://blog.csdn.net/lxkll/article/details/84284429
最近在跟着做vue2.0以上版本的一個購物平台,在涉及到模擬后台數據交互的時候,視頻里講的是通過json-server和express,由於之前的配置都是在build/dev-server.js文件下,dev-server.js在vue2.0都沒有了,整合到了build/webpack.dev.conf.js文件里,通過綜合幾篇博文,最終問題得以解決。
一、模擬后台數據交互,vue中需要使用vue-resource這個組件,首先需要下載該組件:
1. cnpm install vue-resource --save
2. 在main.js文件中引入該組件並使用:
import VueResource from 'vue-resource'
Vue.use( VueResource )
具體如下圖:

3. 接下來就可以在任何組件內部使用了:
this.$http.get( ).then( (res) => {} , (err) => { }) (then前面獲取了一個promise對象)
上面步驟是用vue-resource來進行數據請求的大體流程,作為前端,我們只關注前端的開發,所以使用mock data來模擬后台傳數據,主要有兩種方式:
1)json-server模擬數據;此方法只能發送get請求不能發送post請求
2)express啟動數據服務;get請求和post請求都可以發送
二、 json-server
首先npm安裝
npm install json-server --save
然后在build/webpack.dev.conf.js中進行配置
將下面代碼片段加入到webpack.dev.conf.js中
/*----------------jsonServer---------*/
/*引入json-server*/
const jsonServer = require('json-server')
/*搭建一個server*/
const apiServer = jsonServer.create()
/*將db.json關聯到server*/
const apiRouter = jsonServer.router('db.json')
const middlewares = jsonServer.defaults()
apiServer.use(middlewares)
apiServer.use(apiRouter)
/*監聽端口*/
apiServer.listen(3000, () => {
console.log('JSON Server is running')
})

配置完成以后,重新npm run dev 啟動,瀏覽器輸入localhost:3000,出現如下圖,說明配置成功

現在還有一個問題,我們代碼的服務端接口是8080,json-server的服務端端口是3000。端口不同,這樣請求會存在一個跨域問題,所以這里要做一個服務端代理的配置,配置config/index.js中找到proxyTable,並添加一下內容:
// 配置轉化:從3000 => 8080
proxyTable: {
'/api': {
changeOrigin: true,// 如果接口跨域,需要進行這個參數配置
target: 'http://localhost:3000',// 接口的域名
pathRewrite: {
'^/api': ''//后面可以使重寫的新路徑,一般不做更改
}
}
},

注意:配置好后,一定要npm run dev 重新啟動項目
當在瀏覽器地址欄輸入:http://localhost:8080/api 就等同於http://localhost:3000端口了

4.要訪問並獲取數據,就需要有數據(假數據),這時候需要在vue文件夾的根目錄下創建一個db.json文件
{ "getNewsList": [ { "id": 1, "title": "新聞條目1新聞條目1新聞條目1新聞條目1", "url": "http://starcraft.com" }, { "id": 2, "title": "新聞條目2新聞條目2新聞條目2新聞條目2", "url": "http://warcraft.com" }, { "id": 3, "title": "新聞條3新聞條3新聞條3", "url": "http://overwatch.com" }, { "id": 4, "title": "新聞條4廣告發布", "url": "http://hearstone.com" } ] }
將db.json放在根目錄下(與index.html在同一目錄)
三、express
1. 找到webpack.dev.conf.js文件,
//express 配置server
var apiServer = express()
var bodyParser = require('body-parser')
apiServer.use(bodyParser.urlencoded({ extended: true }))
apiServer.use(bodyParser.json())
var apiRouter = express.Router()
var fs = require('fs')
apiRouter.route('/:apiName') //接口路徑
.all(function (req, res) {
fs.readFile('./db.json', 'utf8', function (err, data) { //讀取接口文件
if (err) throw err
var data = JSON.parse(data)
if (data[req.params.apiName]) {
res.json(data[req.params.apiName])
}
else {
res.send('no such api name')
}
})
})
apiServer.use(apiRouter);
apiServer.listen(3000, function (err) {
if (err) {
console.log(err)
return
}
console.log('Listening at http://localhost:' + 3000 + '\n')
})
2.同樣的, 在config/index.js文件下進行proxyTable的配置
proxyTable: {
// 訪問/api/時,跳轉到3000端口
'/api': {
changeOrigin: true, // 如果接口跨域,需要進行這個參數配置
target: 'http://localhost:3000',// 接口的域名
pathRewrite: {
'^/api': ''//后面可以使重寫的新路徑,一般不做更改
}
}
},
最最最重要的是: build和config以及db.json文件中有任何修改,都必須重新 " npm run dev" 一次。另外,這兩種方法一旦"npm run dev" 以后,若是改動了以上的文件,必須關閉git bash窗口,重新打開進行 "npm run dev"
