搜索到5篇与后端的结果
node跨域解决方案 ## 同源政策 #### 什么是同源? > 如果两个页面拥有相同的协议,域名和端口,那么这两个页面就属于同一个源,其中只要有一个不相同,就是不同源。 #### 同源政策的目的 > 同源政策是为了保证用户信息的安全,防止恶意的网站窃取数据,最初的同源政策是指A网站在客户端设置的cookie,B网站是不能访问的。 > > 随着互联网的发展,同源政策也越来越严格了,在不同源的情况下,其中有一项规定就是无法向非同源地址发送Ajax请求,如果有请求浏览器就会报错 #### 使用JSONP 解决同源限制问题 > jsonp 是 json with padding 的缩写,它不属于Ajax请求,但它可以模拟Ajax请求 1. 将不同源的服务器端请求地址写在script标签的src属性中 ```javascript <script src="http://localhost:3001/test"></script> ``` 2. 服务器端响应数据必须是一个函数的调用,真正要发送给客户端的数据需要找我函数调用的参数 ```javascript var data = 'fn({name: "xiaoke" , age: "16" })' res.send(data) ``` 3. 在客户端全局作用域下定义函数 fn ```javascript function fn (data) {} ``` 4. 在 fn 函数内部对服务器端返回的数据进行处理 ```javascript function fn (data) { console.log(data) } ``` #### CORS 跨域资源共享 > CORS:全称为 Cross-origin resource sharing 即跨域资源共享,它允许浏览器向跨域服务器发送Ajax请求,克服了Ajax 只能同源使用的限制 ```javascript origin: http://localhost:3000 ``` ##### 服务器端代码 ```javascript // 所有express框架得中间件 拦截所有的请求 // 拦截所有请求 app.use('*',function (req, res, next) { res.header('Access-Control-Allow-Origin', '*'); //这个表示任意域名都可以访问,这样写不能携带cookie了。 //res.header('Access-Control-Allow-Origin', 'http://www.baidu.com'); //这样写,只有www.baidu.com 可以访问。 res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild'); res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');//设置方法 if (req.method == 'OPTIONS') { res.send(200); // 意思是,在正常的请求之前,会发送一个验证,是否可以请求。 } else { next(); } }); ```
2021-06-07
7℃
0
0
node.js 发送邮件 # node.js 发送邮件 > 下载 nodemailer 模块 来发送邮件 ```nginx npm install nodemailer ``` 引入 nodemailer 模块: ```javascript const nodemailer = require('nodemailer') ``` 配置邮箱信息 ```js var transporter = nodemailer.createTransport({ host: smtp.qq.com, // 端口 port: 465, // 开启安全连接 secureConnection: true, secure: true, // 发件人配置 auth: { // 邮箱账号 user: "", // 授权码 pass: "" }, }) ``` 配置发送信息 ```javascript // 发送内容 var mailOptios = { // 发件人邮箱 from: "", // 收件人邮箱 to: "", // 邮件主题 subject: 'XIAOKE图床邮箱验证', // 内容 // text: "测试邮件" html: ` <h1>尊敬的用户<h1/> <p>您刚刚在<span style="color:red;">XIAOKE图床</span>提出账号注册申请验证</p> <p>你的验证码是:<span style="color:red;">${emailobj.Verification}</span> </p> <p>验证码有效期:<span style="color:red;">2分钟</span></p> <div style="text-align: right;"> <p>如果不是您主动注册或操作,请无视本邮件即可!</p> <p>感谢您的访问,祝您访问愉快,系统邮件请勿回复!</p> <p>——来自<span style="color:red;">XIAOKE图床</span></p> </div> ` } ``` 发送 ```JavaScript // 发送 transporter.sendMail(mailOptios, (err, info) => { if (err) { console.log('发送失败!') return } console.log('发送成功!') }) ```
2021-06-07
10℃
0
0
node.js使用Sequelize操作mysql # node.js使用Sequelize操作mysql ## 1.安装 ```nginx npm install --save sequelize npm install --save mysql2 ``` ## 2.连接数据库 ```javascript const Sequelize = require('sequelize'); const sequelize = new Sequelize('test', 'root', '658575', { host: 'localhost', dialect: 'mysql', port:'3306' }) sequelize .authenticate() .then(() => { console.log('连接成功'); }) .catch(err => { console.error('Unable to connect to the database:'); }); ``` ## 3.创建模型 ### 表约束 - timestamps:是否给每条记录添加 createdAt 和 updatedAt 字段,并在添加新数据和更新数据的时候自动设置这两个字段的值,默认为true - paranoid:设置 deletedAt 字段,当删除一条记录的时候,并不是真的销毁记录,而是通过该字段来标示,即保留数据,进行假删除,默认为false - freezeTableName:禁用修改表名; 默认情况下,sequelize将自动将所有传递的模型名称(define的第一个参数)转换为复数。 默认为false - tableName:手动设置表的实际名称 - 定义表索引 indexes:Array<Object> ### 字段约束 - type:字段类型,String|DataTypes - allowNull:是否允许为空,默认为true - defaultValue:默认值,默认为null - unique:值唯一,默认为false - primaryKey:是否为主键,默认为false ```java // 导入创建模型需要的函数 const { Sequelize, sequelize } = require('../init') // 创建模式 第一个参数是 表名 const User = sequelize.define('user', { // 一个对象就是一个字段 username: { // 约束字段的类型 type: Sequelize.STRING, // 是否允许为空 默认是 true allowNull: false, }, password: { type: Sequelize.STRING, // 是否允许为空 默认是 true allowNull:false } }) ``` ### 4.查询数据 ```javascript // 查找所有用户 User.findAll().then(users => { // 转换为 json 字符串 console.log("All users:", JSON.stringify(users, null, 4)); }); ``` ### 5.创建用户 ```javascript // 创建新用户 // 创建成功返回 用户对象 User.create({ username: "admin", password:"123456"}).then(user => { console.log('创建成功!'+ user.username); }); ``` ### 6.修改用户信息 ```javascript // 将所有 password 为 123456 User.update({ password: "123456" }, { where: { password: '' } }).then(() => { console.log("修改成功"); }); ``` ### 7.删除用户 ```javascript // 删除所有名为“admin”的人 User.destroy({ where: { username: 'admin' } }).then(() => { console.log("删除所有名为admin的用户成功"); }); ```
2021-06-07
10℃
1
0
tp5-editor.md--使用上传文件没有回显url 问题 ## editor.md 上传文件成功但是它没有回显URL 主要问题就是你返回的格式不正确,它要求的返回格式是一个空格存在都不允许,昨晚我就是搞了一晚上,没搞懂!今天早上一看好像多了一个空格,删了,就TM解决了。。 官方要求的返回格式 ```json { success : 0 | 1, // 0 表示上传失败,1 表示上传成功 message : "提示的信息,上传成功或上传失败及错误信息等。", url : "图片地址" // 上传成功时才返回 } ``` 还有就是你后端接收的表单 name 有可能出错了 官方这里的表单 name 是 editormd-image-file ## 具体代码 **前端** ```javascript var editor = editormd("write_post_main_content", { watch: false, // width : "100%", // height : "100%", path: "/static/admin/lib/editor.md-master/lib/", width: "100%", height: '400px', // theme: "dark", // previewTheme: "dark", // editorTheme: "pastel-on-dark", markdown: "", codeFold: true, //syncScrolling : false, saveHTMLToTextarea: true, // 保存 HTML 到 Textarea searchReplace: true, //watch : false, // 关闭实时预览 htmlDecode: "style,script,iframe|on*", // 开启 HTML 标签解析,为了安全性,默认不开启 // toolbar: false, //关闭工具栏 //previewCodeHighlight : false, // 关闭预览 HTML 的代码块高亮,默认开启 emoji: true, taskList: true, tocm: true, // Using [TOCM] tex: true, // 开启科学公式TeX语言支持,默认关闭 flowChart: true, // 开启流程图支持,默认关闭 sequenceDiagram: true, // 开启时序/序列图支持,默认关闭, toolbarIcons: function () { // Or return editormd.toolbarModes[name]; // full, simple, mini // Using "||" set icons align right. return ["undo", "redo", "|", "bold", "hr",'image', "|", "watch", "|", "fullscreen", "info", "testIcon", "testIcon2", "file", "faicon", "||", "watch", "testIcon"] }, // saveHTMLToTextarea : true, imageUpload : true, imageFormats : ["jpg", "jpeg", "gif", "png", "bmp", "webp"], imageUploadURL : "/admin/Upload/index", }); ``` PHP(框架TP5) ```PHP <?php namespace app\admin\controller; use think\Controller; use think\facade\Request; class Upload extends Controller { public function index(){ if(request()->isPost()) { // 获取上传的文件 image 表单 name 名 $file = Request::file('editormd-image-file'); // 文件存储位置 $info = $file->move('../public/uploads'); // 判断上传信息 if ($info) { // return json([ 'success' => 1, 'message' => '上传成功!', 'url' => str_replace('\\', '/', Request::domain() . '/uploads/' . $info->getSaveName()) ]); } else { // 上传失败获取错误信息 echo $file->getError(); } } else { return '非法请求!'; } } } ```
2021-06-07
8℃
0
0
node.js-获取网站标题 ## 前言 使用 node.js 获取网站得标题,使用的是 本地 的 http / https 模块 进入访问 目标网站,然后通过 cheerio 操作返回的DOM,就可以了 # 下载 cheerio 和 express ```nginx npm install cheerio express ``` # 引入包 ```javascript const express = require('express') // 引入处理 dom 模块 基于 jquery const cheerio = require('cheerio') const http = require('http') const https = require('https') ``` # 创建一个 app 并且监听 3000端口 ```javascript const app = express() app.listen(3000) ``` # 创建路由 ```javascript app.get('/get_title', (req, res) => { }) ``` # 接收传递过来的网站参数并且判断它是那种协议 ```javascript app.get('/get_title', (req, res) => { const url = req.query.url // 判断是否传递了 url if (!url) { res.send('请传递网站地址') return } const urlType = url.split(':')[0] == 'http' ? http : https }) ``` # 使用 http / https 模块进行发送请求 ```javascript let web = urlType.request(url, (result) => { let chunks = [] // 拼接请求片段数据 result.on('data', c => chunks.push(c)) // 拼接完成 result.on('end', () => { // 拼接所有的 chunks,并且转换为字符串 let data = Buffer.concat(chunks).toString('utf-8') // 使用 cheerio let $ = cheerio.load(data) // 获取到标题并且返回 res.send($('title').text()) }) }) //发送 web.end() ``` # 最后我们用一下 try catch 来处理一下错误信息 ```javascript try { let web = urlType.request(url, (result) => { let chunks = [] // 拼接请求片段数据 result.on('data', c => chunks.push(c)) // 拼接完成 result.on('end', () => { // 拼接所有的 chunks,并且转换为字符串 let data = Buffer.concat(chunks).toString('utf-8') let $ = cheerio.load(data) res.send($('title').text()) }) }) web.end() } catch { res.send('请正确的填写网站地址!') } ``` # 完整代码 ```javascript const express = require('express') // 引入处理 dom 模块 基于 jquery const cheerio = require('cheerio') const http = require('http') const https = require('https') const app = express() // 创建路由 app.get('/get_title', (req, res) => { const url = req.query.url // 判断是否传递了 url if (!url) { res.send('请传递网站地址') return } const urlType = url.split(':')[0] == 'http' ? http : https try { let web = urlType.request(url, (result) => { let chunks = [] // 拼接请求片段数据 result.on('data', c => chunks.push(c)) // 拼接完成 result.on('end', () => { // 拼接所有的 chunks,并且转换为字符串 let data = Buffer.concat(chunks).toString('utf-8') let $ = cheerio.load(data) res.send($('title').text()) }) }) web.end() } catch { res.send('请正确的填写网站地址!') } }) app.listen(3000) ```
2021-06-07
25℃
0
1