Nodejs+Express自定义API接口并使用reactjs调用

xiaoxiao2021-02-28  48

简介

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Express 是基于Node.js 平台,快速、开放、极简的 web 开发框架。

Nodejs+Express可以让前端人员自定义API接口并实现调用。 这样写项目就方便多了,数据想怎么写就怎么写。

过程

1.新建项目文件夹

mkdir nodejs-express-react

2.初始化package.json

cd nodejs-express-react && npm init

3.安装需要的依赖

全局安装babel webpack webpack-dev-server

npm install babel webpack webpack-dev-server -g

项目安装webpack webpack-dev-server html-webpack-plugin(在build里生成自动引用bundle.js的html文件)

npm install webpack webpack-dev-server html-webpack-plugin –save

项目安装express框架

npm install express –save

项目安装react和react-dom

npm install react react-dom –save

项目安装Babel转换器,解析jsx

npm install babel babel-loader babel-core babel-preset-react babel-preset-latest –save

项目安装jquery

npm install jquery –save

4.创建项目文件

webpack.config.js var webpack = require('webpack'); var path = require('path'); var HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry:'./entry.js', output:{ path:path.join(__dirname, '/build'), filename:"bundle.js" }, devServer:{ inline:true, port:3000 }, module:{ loaders:[ { test:/\.js?$/, loader:'babel-loader', query: { presets: ['react', 'latest'] } } ] }, plugins:[ new HtmlWebpackPlugin({ template:'./index.html' }), new webpack.HotModuleReplacementPlugin()//热加载 ], resolve: { modules: [path.resolve(__dirname,'node_modules')] } } .babelrc(jsx=>js配置) { "presets": [ "latest", "react" ] } index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>demo</title> </head> <body> <div id="app"></div> </body> </html> entry.js (react入口文件) import React from 'react'; import ReactDOM from 'react-dom'; import App from './App'; ReactDOM.render(<App />, document.getElementById('app')); server.js (express服务器文件) var express = require('express'); var app = express(); var _data = { "id":"1", "name":"zysoft", "sex":"男", "age":"23" } app.get('/introduce',function(req,res){ res.send(_data); }) app.listen(8888,function(){ console.log('listening on *:8888'); }); app.js(react组件文件) import React,{Component} from 'react'; import $ from 'jquery'; export default class App extends Component { componentDidMount(){ $.get('http://localhost:8888/introduce',function(data){ console.log(data); }) } render(){ return( <p style={{ margin:'20px', fontFamily:'幼圆' }}>按F12查看获取到的数据</p> ) } }

运行

1.运行配置:在package.json中找到scripts标签,若没有则添加

"scripts": { "dev": "webpack-dev-server --devtool eval --progress --colors --hot --content-base build", "build": "webpack", "server": "node server.js", "start": "start http://localhost:3000" },

2.运行过程:(dev和server需要保留所以要开不止一个终端)

npm run build

相当于执行webpack命令,会自行查找webpack.config.js,根据配置生成build文件夹,并在该目录下生成bundle.js和自行引用bundle.js的index.html文件

npm run server

相当于执行node server.js 打开设定好的8888端口/开启服务。

npm run dev

相当于执行webpack-dev-server –devtool eval –progress –colors –hot –content-base build,这句话可以使页面有热更新的功能,即更改完代码,不用重新打包并执行webpack-dev-server,在页面自行刷新查看更改后的结果。

npm start

相当于执行start http://localhost:3000,自行打开浏览器并访问localhost:3000,查看结果。

打开F12查看控制台信息。

注意这里的报错:

很明显的跨域问题!

有人说使用$.ajax() 把dataType属性设置为”jsonp”就可以解决,但是这样实行后会报错“Unexpected token :”,这是因为你写入的明明是json格式,用jsonp来解析当然会有格式的问题。这里不推荐使用此方案。

主要的解决方案还是要在header上下功夫

理解header原理: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html http://kb.cnblogs.com/page/92320/

Access-Control-Allow-Origin 允许的域 Access-Control-Allow-Headers 允许的header类型

打开我们的server.js,加入以下代码设置跨域访问:

//设置跨域访问 app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS"); res.header("X-Powered-By",' 3.2.1') res.header("Content-Type", "application/json;charset=utf-8"); next(); });

重新生成

刷新页面

获取到自定义的api数据就可以任意的在前端页面上展示了~

github源码地址:https://github.com/zhaoyu69/nodejs-express-react

有问题欢迎指出,如果有用 欢迎star★。

转载请注明原文地址: https://www.6miu.com/read-77526.html

最新回复(0)