不知道写的代码和操作流程对不对,但是目前一点击按钮报错信息却是jQuery的

不知道写的代码和操作流程对不对,但是目前一点击按钮报错信息却是jQuery的

页面文件 index.html

<!DOCTYPE html>

<html lang="en">


<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>test</title>

    <style>

        input {

            width: 200px;

            height: 30px;

            line-height: 30px;

            border: 1px solid blue;

            margin: 20px 0;

        }

        

        p {

            width: 200px;

            text-align: center;

        }

        

        button {

            background-color: blue;

            color: #fff;

            border: none;

            padding: 10px;

        }

    </style>

</head>


<body>

    <!-- 表单 -->

    <form>

        <input type="text" name="username" id="username" placeholder="请输入昵称"><br>

        <input type="password" name="password" id="password" placeholder="请输入密码"><br>

        <p>

            <button id="register">注册</button>

            <button id="login">登录</button>

        </p>

    </form>

    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

    <script>

        //注册按钮绑定事件

        $('#register').on('click', function(e) {

            // 阻止默认行为

            e.preventDefault();

            // 获取用户名和密码

            const username = $('#username').val;

            const password = $('#password').val;

            // 发送ajax请求

            $.ajax({

                url: 'http://localhost/users/register',

                type: 'POST',

                data: {

                    username,

                    password

                },

                success: function(data) {

                    console.log(data);

                }

            })

        });


        //登录按钮绑定事件

        $('#login').on('click', function(e) {

            // 阻止默认行为

            e.preventDefault();

            // 获取用户名和密码

            const username = $('#username').val;

            const password = $('#password').val;

            // 发送ajax请求

            $.ajax({

                url: 'http://localhost/users/login',

                type: 'POST',

                data: {

                    username,

                    password

                },

                success: function(data) {

                    console.log(data);

                }

            })

        });

    </script>

</body>


</html>


服务端项目文件:

app.js

const Koa = require('koa')

const app = new Koa()

const views = require('koa-views')

const json = require('koa-json')

const onerror = require('koa-onerror')

const bodyparser = require('koa-bodyparser')

const logger = require('koa-logger')

const static = require('koa-static')

const session = require('koa-generic-session')

const cors = require('cors')


const index = require('./routes/index')

const users = require('./routes/users')

const test = require('./routes/test')


// error handler

onerror(app)


// middlewares

app.use(bodyparser({

    enableTypes: ['json', 'form', 'text']

}))

app.use(json())

app.use(logger())

app.use(static(__dirname + '/public'))


app.use(views(__dirname + '/views', {

    extension: 'pug'

}))


app.keys = [''] // 秘钥


app.use(session({

    // 配置 cookie

    cookie: {

        path: '/',

        httpOnly: true,

        maxAge: 24 * 60 * 60 * 1000

    }

}))


// 服务端支持跨域

app.use(cors({

    origin: '*', // 支持任何域,可以跨域

    credentials: true // 允许跨域的时候带着 cookie

}))


// logger

app.use(async(ctx, next) => {

    const start = new Date()

    await next()

    const ms = new Date() - start

    console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)

})


// routes

app.use(index.routes(), index.allowedMethods())

app.use(users.routes(), users.allowedMethods())

app.use(test.routes(), test.allowedMethods())


// error-handling

app.on('error', (err, ctx) => {

    console.error('server error', err, ctx)

});


module.exports = app

db/db.js

const mongoose = require('mongoose')


const url = 'mongodb://localhost:27017'

const dbName = 'test'


mongoose.set('useCreateIndex', true)

mongoose.set('useFindAndModify', true)


mongoose.connect(`${url}/${dbName}`, {

    useNewUrlParser: true,

    useUnifiedTopology: true

})


const conn = mongoose.connection


conn.on('error', err => {

    console.log('mongoose连接出错', err)

})


module.exports = mongoose

db/model.js

const mongoose = require('./db')


// 定义 User Schema

const UserSchema = mongoose.Schema({

    username: {

        type: String,

        required: true,

        unique: true

    },

    password: {

        type: String,

        required: true

    }

}, {

    timestamps: true

})


// 定义 User Model

const User = mongoose.model('user', UserSchema)


module.exports = User

middlewares/login.js

// 登录验证的中间件


async function loginCheck(ctx, next) {

    const userInfo = ctx.session.userInfo

    if (userInfo && userInfo.username && userInfo.password) {

        // 登录验证成功

        await next()

        return

    }

    // 登录验证失败

    ctx.body = {

        errno: -1,

        message: '请输入正确的用户名和密码'

    }

}


module.exports = loginCheck

routes/test.js


const router = require('koa-router')()

const { User } = require('../db/model')

const login = require('../middlewares/login')


router.prefix('/users')


router.post('/register', async(ctx) => {

    // 获取请求

    const body = ctx.request.body


    // 获取请求数据

    const { username, password } = body


    // 插入到数据库

    const newUser = await User.create({

        username,

        password

    })


    // 设置返回信息

    ctx.body = {

        errno: 0,

        message: '注册成功'

    }

})


router.post('/login', login, async(ctx) => {

    // 获取请求

    const query = ctx.query


    // 插入到数据库

    const userInfo = await User.find({

        username: query.username

    })


    // 设置返回信息

    ctx.body = {

        errno: 0,

        data: userInfo,

        message: '登录成功'

    }

})


module.exports = router


然后我把index.html是放在phpstudy文件夹下并且启动了的:

http://img1.sycdn.imooc.com//climg/5f030bd8090bd15306680236.jpg

http://img1.sycdn.imooc.com//climg/5f030be309b4a22803940325.jpg

然后打开了数据库并且连接了

http://img1.sycdn.imooc.com//climg/5f030f2609423d8809640548.jpg

http://img1.sycdn.imooc.com//climg/5f030f41091641a609750486.jpg

然后在数据库中建立了这个test数据库及users集合:

http://img1.sycdn.imooc.com//climg/5f030cba09a8f06b12320667.jpg

不知道是否要在项目文件夹中运行npm run dev,在补充了插件后运行也成功了:

package.json:

{

  "name": "test4",

  "version": "0.1.0",

  "private": true,

  "scripts": {

    "start": "node bin/www",

    "dev": "./node_modules/.bin/nodemon bin/www",

    "prd": "pm2 start bin/www",

    "test": "echo \"Error: no test specified\" && exit 1"

  },

  "dependencies": {

    "cors": "^2.8.5",

    "debug": "^4.1.1",

    "koa": "^2.7.0",

    "koa-bodyparser": "^4.2.1",

    "koa-convert": "^1.2.0",

    "koa-generic-session": "^2.0.4",

    "koa-json": "^2.0.2",

    "koa-logger": "^3.2.0",

    "koa-onerror": "^4.1.0",

    "koa-router": "^7.4.0",

    "koa-static": "^5.0.0",

    "koa-views": "^6.2.0",

    "mongoose": "^5.9.21",

    "pug": "^2.0.3"

  },

  "devDependencies": {

    "nodemon": "^1.19.1"

  }

}

最后在页面中输入用户名和密码,点击注册后,出现如下错误:

http://img1.sycdn.imooc.com//climg/5f031024092f23e913650661.jpg

一开始我的jQuery地址使用的是官网的:

https://code.jquery.com/jquery-3.5.1.min.js

然后换成了网上找的百度的引用地址:

http://libs.baidu.com/jquery/1.9.1/jquery.min.js

结果报错变了:

http://img1.sycdn.imooc.com//climg/5f0310be0915d22106920248.jpg

然后又换成了老师回答中的实例的地址:

https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js

结果这次报错和第一次的jQuery地址报错一样,都是http://img1.sycdn.imooc.com//climg/5f03111f099fc96806600266.jpg

不知道这到底是jQuery地址有问题,还是我哪个地方代码错误?还是我什么地方操作错了呢?

正在回答

登陆购买课程后可参与讨论,去登陆

7回答

同学你好,以同学第一次粘贴的代码测试,jQuery引入地址是没有问题,是代码中存在问题, 具体解答如下:

  1. val是一个方法,调用时需要添加括号,建议修改:

    http://img1.sycdn.imooc.com//climg/5f03dfc40969e56e05800142.jpg

  2. 因为启动node服务,默认是3000端口,所以在访问接口时,需要添加上端口号

    http://img1.sycdn.imooc.com//climg/5f03e001090e5bdb06560325.jpg

    http://img1.sycdn.imooc.com//climg/5f03e00b0953c1d906330182.jpg

  3. 登录时不需要使用中间件进行验证是否登录,建议去掉。

    http://img1.sycdn.imooc.com//climg/5f03e1e209622c2006160080.jpg

  4. 调整获取登录信息的方式

    http://img1.sycdn.imooc.com//climg/5f03e28009d585f605850263.jpg

  5. 因为model.js中导出的只有一个变量,所以在test.js中直接定义常量接收就可以了。建议修改:

    http://img1.sycdn.imooc.com//climg/5f0d1a0c091af56d06610108.jpg

  6. 使用 koa2-cors 插件设置允许跨域,即:

    安装插件 cnpm i koa2-cors --save

    app.js引入koa2-cors 

    http://img1.sycdn.imooc.com//climg/5f03e9d30981dd1604230064.jpg

    设置允许跨域

    http://img1.sycdn.imooc.com//climg/5f03ea2a091793ab05800149.jpg

  7. 经过上述修改后,测试结果如下:

    注册

    http://img1.sycdn.imooc.com//climg/5f03eaa009d44a3b14830536.jpg

    登录

    http://img1.sycdn.imooc.com//climg/5f03eabe09995cf218350561.jpg

    数据库中也正常存入了数据

    http://img1.sycdn.imooc.com//climg/5f03eae509e5d0f012910493.jpg

同学可以测试理解下,祝学习愉快~

  • Aurora_Meteor 提问者 #1
    老师我按您的修改以后,还有其他错误。 我是应该把这里都解决完了呢,还是直接学下一节的综合案例去呢?
    2020-07-07 12:13:07
好帮手慕慕子 2020-07-07 19:14:21

同学你好,对于你的问题解答如下:

  1. 后台返回的信息,在ajax的success方法中就可以获取到,同学如下所示代码书写就是获取返回的信息

    http://img1.sycdn.imooc.com//climg/5f045561090e3cec06890388.jpg

    老师前几次的回复是为了方便同学直观的看到效果,所以截图在network中查看返回的信息

  2. 是的,前台注册、登录要显示验证结果是在前台中设置(也就是这里的html文件中设置)

    ajax请求是异步的,直接在ajax外面获取不到数据。示例:

    http://img1.sycdn.imooc.com//climg/5f045890096dd4d609170605.jpg

    test打印结果是undefined,所以说不可以直接在ajax外使用返回的数据

    http://img1.sycdn.imooc.com//climg/5f0458ef096b6f2e08680489.jpg

    推荐同学参考老师上次回复的内容,直接在ajax内部的success中进行判断,然后提示用户,老师上一次回复中,也给出了示例,同学可以测试下

    http://img1.sycdn.imooc.com//climg/5f0457eb0972510c06160530.jpg

祝学习愉快~

好帮手慕慕子 2020-07-07 14:58:41

同学你好,如下如所示圈起来的理解是对的

http://img1.sycdn.imooc.com//climg/5f041d900933a30606730109.jpg

是指验证是否登录成功吗?如果是的话,直接在success方法中验证就可以了,示例:

http://img1.sycdn.imooc.com//climg/5f041e14094871c505510384.jpg

测试结果

http://img1.sycdn.imooc.com//climg/5f041e3809789ce312010297.jpg

这个练习,重点是结合所学知识完成登录和注册功能,对于逻辑的严谨性不做要求,感受下前后端开发的流程就可以了。

老师在这里给同学提供一个参考实现的思路,同学了解一下就可以了。示例:在返回数据之前,添加判断,已经注册过的用户,直接返回提示信息,不再写入数据库,没有注册过的用户才添加到数据库中

http://img1.sycdn.imooc.com//climg/5f041bd30931240406390774.jpg

测试结果如下:

http://img1.sycdn.imooc.com//climg/5f041be909d5017311310446.jpg

http://img1.sycdn.imooc.com//climg/5f041c0109f3d09011530503.jpg

在登录接口这里添加判断,如果数据库中存在,表示已经注册了,可以直接登录,否则提示该用户该没有注册

http://img1.sycdn.imooc.com//climg/5f041c7809725e3607290657.jpg

测试结果如下:

http://img1.sycdn.imooc.com//climg/5f041c8a09cc85cd17280592.jpg

http://img1.sycdn.imooc.com//climg/5f041c99093b445c13340654.jpg

因为实际工作中是要根据具体要实现的功能进行逻辑编写的。目前阶段,重点是学习node相关的基础知识和开发流程,对于逻辑不做要求的

同学可以测试理解下,祝学习愉快~

  • 提问者 Aurora_Meteor #1
    后台设置的返回信息都是在network中的是吗? 前台注册、登录要显示的验证结果还是要在前台中设置吧,前台显示的验证结果是在ajax请求外部设置的吧?就是点击按钮后的弹框什么的那种信息,用户可以看到的。
    2020-07-07 15:23:44
好帮手慕慕子 2020-07-07 13:37:31

同学你好, 时间比较着急的话,可以直接学下一节的综合案例,如果时间比较充裕的话,建议处理完这里的再开始学习下一节的案例,

如下所示位置也需要修改下:

http://img1.sycdn.imooc.com//climg/5f0409ca09accbd707460118.jpg

同学修改后可以再测试下,祝学习愉快~

  • 提问者 Aurora_Meteor #1
    老师我修改后测试发现不报错了。 但是我发现如果输入的用户名和密码是没有注册过的,点击登录按钮,控制台也会打印‘登录成功’;然后我把数据库中注册的信息都删除以后,直接在页面中输入用户名和密码,在数据库中没有任何数据的情况下,点击登录按钮,控制台一样会打印‘登录成功’。 ‘注册成功’和‘登录成功’都是页面文件index.html中的script中的ajax语句打印的,这是因为只要ajax请求成功了index.html中script的ajax部分的success函数就会执行,所以会打印出来嘛?要验证的话,是在ajax外面设置并且在外面输出验证结果对吗?
    2020-07-07 13:49:15
提问者 Aurora_Meteor 2020-07-07 12:11:56

在页面输入内容,点击注册按钮后,控制台报错:

http://img1.sycdn.imooc.com//climg/5f03f54c09796c6f09970688.jpg

http://img1.sycdn.imooc.com//climg/5f03f5590922824709970688.jpg

页面的控制台报错:

http://img1.sycdn.imooc.com//climg/5f03f56609846a4410860246.jpg

页面的network:http://img1.sycdn.imooc.com//climg/5f03f57e09e439a307320344.jpg

routes/test.js中的create:

http://img1.sycdn.imooc.com//climg/5f03f60b09e3491c05890489.jpg

提问者 Aurora_Meteor 2020-07-06 20:04:45

我尝试了网上的新浪的jQuery:http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js,报错和问题中说的引用百度的jQuery一样。

360的 http://libs.useso.com/js/jquery/1.9.1/jquery.min.js 和

google的 http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js 报错一样,都是下面这个:http://img1.sycdn.imooc.com//climg/5f03129d096262b013620306.jpg


提问者 Aurora_Meteor 2020-07-06 19:57:42

npm run dev 运行截图:

http://img1.sycdn.imooc.com//climg/5f0311b209de5e2605120260.jpg

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
5. Node.js全栈开发
  • 参与学习           人
  • 解答问题       307    个

前端工程师会后端开发已是趋势。从node.js到koa2再到数据库知识。结合真实项目,从项目需求分析、接口和数据设计到业务开发,帮你打通前后端任督二脉,为就业加码。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师