1、遇到的问题
向数据库插入一条记录,插入失败,但是Ajax请求接口以后不成功,不走succeess函数,试过了也不走error函数。
要向用户提示,数据插入失败,直觉是靠return,但是发现请求总会进入Ajax代Ajax({})内部,所以用flag。
var flag=true
var loans_url = "/loans/";
var query_url = base_url + loans_url;
$.ajax({
url: query_url,
type: "post",
data: data,
success: function (res) {
flag=false
console.log(flag) //false
window.location.href="loandetail.html"
}
})
console.log(flag) //true
if(flag){
alert("User or book does not exist")
}
但是发现在请求函数外,flag还是true。
原因:ajax请求是异步请求。会发生在alert之后。解决:改为同步请求,加一行代码
async:false,
2、数据去重
var ary = [];
function dynamicAddUser(data) {
for (var i = 0; i < ary.length; i++) {
if (ary.indexOf(data.id)!==-1) {
return;
}
}
ary.push(data.id);
//对本条数据进行展示
}
除了用indexOf,还可以用
if (ary[i]==data.id) {
return;
}
3、给动态元素绑定事件
var spanA = document.createElement("span");
var spanB = document.createElement("span");
$(spanA).text("modify");
spanA.style.marginRight = "20px"
$(spanB).text("delete")
$(spanA).click(sel);
$(spanB).click(del);
spanA.style.cursor = "pointer";
spanB.style.cursor = "pointer";
tdNodeOper.appendChild(spanA);
tdNodeOper.appendChild(spanB);
在js里面写函数即可。
function sel() {
var userid = $(this.parentNode).attr("uid");
window.location.href = "modifyUser.html?id=" + userid;
}
function del() {
var userid = $(this.parentNode).attr("uid");
var users2_url = "/users/" + userid;
var query_url = base_url + users2_url;
$.ajax({
url: query_url,
type: "delete",
success: function (res) {
window.location.href = "user.html"
}
})
}
del()删除函数:需要携带userid。
sel():修改本条数据,先把id带到modify页面。在modify页面接收参数。
var userid = location.search.split('=')[1];
const base_url = "http://127.0.0.1:3000";
var users_url = "/users/" + userid;
var query2_url = base_url + users_url;
$.ajax({
url: query2_url,
type: "get",
success: function (res) {
$("#name").val(res.name);
$("#barcode").val(res.barcode);
$("#type").val(res.memberType)
}
})
第一个可以取到userid,之后根据userd请求本条数据,在渲染到页面。
4、node.js给数据库中添加表,一定先在data.js里面定义如下:
const Sign = sequelize.define("Sign", {
name: Sequelize.STRING,
password: Sequelize.INTEGER
});
然后可以在route.js定义访问数据的接口。
const express = require("express");
const router = express.Router();
const db = require("../data");
const ret = require("../lib/return");
router.post("/", function(req, res) {
db.Sign.create({
name: req.body.name,
password: req.body.password,
}).then(function(sign) {
ret.json(sign, res);
});
});
router.get("/", function(req, res) {
db.Sign.findAll().then(function(sign) {
ret.json(sign, res);
});
});
module.exports = router;
5、sqlite3数据库需要根据一条数据的一个name进行查询,本来已经有一个根据主键id进行本条数据查询,现在需要根据Snumber学号来进行查询。
router.get("/:uid", function(req, res) {
db.User.findByPk(req.params.uid).then(function(user) {
if (user) {
res.end( ret.json(user, res));
} else {
res.end();
}
});
});
router.get("/:Snumber", function(req, res) {
db.User.findOne({ where: { Snumber: req.params.Snumber } }).then(function(user) {
ret.json(user, res);
});
});
根据主键id查询,可以查到本条数据,我自己用findOne方法根据snumber查询到本条数据,发现只要输入/2019(2019为学号)数据库查询始终把2019赋给id,所以一直返回空。后来想通了,第二个和第一个的请求url一样。只会执行第一个,永远不会执行第二个。
改为
router.get("/:Snumber/s", function(req, res) {
db.User.findOne({ where: { Snumber: req.params.Snumber } }).then(function(user) {
ret.json(user, res);
});
});
只要在请求uil上加一个/s,标识一下,则可以查询到这条数据。