Node.js和SQL来检查数据库的结果

我有这样的挑战,我已经用PHP做了,但想看看如何通过node.js和SQL来完成。

我是这样的初学者,而且不知道我做了什么是合法的,但是想要学会在节点上学习; 挑战是这样的:

我们希望一个函数将浏览器的UserAgent作为一个string,并将其与已批准的浏览器和版本列表进行比较

数据库结构看起来像这样:
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
| bigIntPKID | varchar(50)BrowserName | varchar(50)VersionNumber | bitGreaterVersions |
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
| 1 | Internet Explorer | 9 | False |
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
| 1 | Internet Explorer | 10 | False |
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
| 1 | Chrome | 26 | True |
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
| 1 | Firefox | 22 | True |
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
bitGreaterVersions是任何版本大于版本号是兼容的。

以可读格式表示的数据表格将是“我们的应用程序与IE9,10,Chrome 26+和Firefox 22+兼容”

创build一个将用户代理作为string的函数,如果基于上述条件兼容,则返回true或false。

然后这里是节点和SQL代码(我希望)…

var express = require("express"); var mysql = require("mysql"); var connection = mysql.createConnection({ host: 'localhost', username: 'username', password: 'password', dbname: 'browsers' }); var app = express(); // if there is an error connecting to the database connection.connect(function(error) { if(error) { console.log('Cannot establish connection to database...'); return; } console.log('Database connection established...'); }); // function to check browser compatibility function getUserAgent(userAgent, versionNumber) { var isBrowserCompatible; // access the database app.get("/path-to-database", function(req, res) { // query for the required results connection.query('SELECT BrowserName, VersionNumber, bitGreaterVersions FROM userAgentTable', function(error, rows, fields) { connection.end(); if(error) { console.log('Cannot find the results...'); } isBrowserCompatible = false; // loop over the returned table values for(var i = 0; i < rows.length; i++) { // if browser name and version number are equal to userAgent and versionNumber if(rows[i].BrowserName == userAgent && rows[i].VersionNumber == versionNumber) { // the browser is compatible isBrowserCompatible = true; break; // if browser name is equal to userAgent but the version number is less than versionNumber } else if(rows[i].BrowserName == userAgent && rows[i].VersionNumber < versionNumber) { if(rows[i].bitGreaterVersions == 'False') { // the browser is not compatible break; } else { // otherwise the browser is compatible isBrowserCompatible = true; break; } } } return isBrowserCompatible; }); }); return isBrowserCompatible; } 

希望有人能指出我正确的方向。 我主要是看看实际function是否可以合法写成,如果没有,如何去做,逻辑和所有。 要温柔…

您可以使用ua-parser-js包来parsing用户代理string。

 var parser = require("ua-parser-js"); // somewhere within the server request-response cycle // you get user-agent header var ua = parser(req.headers["user-agent"]); // ua.getBrowser() returns an object with the browser name and version var details = ua.getBrowser(); // eg returns { name: "Chrome", version: "52.0.2743.116" } // details.version.split(".") will return an array of strings // ["52", "0", "2743", "116"] you are only interest in the [0] element var browser = details.name; var version = parseInt(details.version.split(".")[0]); // 52 

browserversion数据武装你可以查询数据库。

 // var mysql = require('mysql'); // etc. etc. connection.query("SELECT * FROM BrowserTable WHERE BrowserName = ?", [browser], function(error, rows) { // handle error if (error) { throw error; } // process the results returned var isCompatible = false; for (var i = 0; i < rows[0].length; i++) { var dbVersion = parseInt(rows[0][i].VersionNumber); if ( ((rows[0][i].bitGreaterVersions == 'True') && (dbVersion < version)) || (dbVersion == version) ) { isCompatible = true; break; } } return isCompatible; });