How to add a SharePoint List Item using Express JS by passing Request Digest


Krishna KV
Team Leader, Aspire Systems
Published On :   01 Apr 2017
Visit Count
Today :  1    Total :   622
Plan, Migrate, Secure, Report
SharePoint & Office 365 Tool. Simple & Easy to Use. 15-Day Trial!

Sharegate: Kick-Ass Tool
Think Your SharePoint & Office 365 Are Secure ? Find Out Now!


This article is about how to configure Express JS and pass the request digest for SharePoint to add a new list item.

Package.json

 {
   "name": "exp",
   "version": "1.0.0",
   "main": "index.js",
   "repository": {},
   "license": "MIT",
   "dependencies": {
     "body-parser": "^1.16.1",
     "compression": "^1.6.2",
     "cookie-parser": "^1.4.3",
     "express": "^4.14.1",
     "httpntlm": "1.7.4", 
     "cors": "2.8.1",
     "async": "2.1.5",
     "agentkeepalive": "3.1.0",
     "httpreq": "0.4.23", 
     "express-api-helper": "0.0.5",
     "request": "2.79.0"
   },
   "devDependencies": {}
 }

To create and update pass the Request-Digest

The below method will get the request digest and add the item to the SharePoint list.

 const express = require('express');
 let router = express.Router();
 let httpntlm = require('httpntlm');
 
 var ntlm = require('httpntlm').ntlm;
 var async = require('async');
 var httpreq = require('httpreq');
 var HttpsAgent = require('agentkeepalive').HttpsAgent;
 var keepaliveAgent = new HttpsAgent();
 
 var app = express()
 function getSPConfig() {
     return {
         url: "https://url-of-the-site/",
         username: 'username',
         password: 'password',
         domain: 'domain',
         workstation: '',
         headers: {
             "Accept": "application/json;odata=verbose",
             "content-type": "application/json;odata=verbose;"
         }
     }
 };
 
 router.post('/', function (req, res) {
 
     getDigest(function (json) {
         let opt = getSPConfig();
          opt.url= opt.url + "_api/web/lists/getByTitle('Testing')/items";
         let metdata = {
             __metadata: { 'type': 'SP.Data.TestingListItem' },
             Title: req.body.Title
         };
         console.log(metdata);
 
         console.log(json.d.GetContextWebInformation.FormDigestValue);
         opt.headers['X-RequestDigest'] = json.d.GetContextWebInformation.FormDigestValue
         opt.json =metdata;
         httpntlm.post(opt, function success(error, addResponse) {
             res.status(200).send("Added");
         });
     }, function error(err) {
         res.status(500).send(err);
     });
 
 });

App.js

 const express = require('express');
 const bodyParser = require('body-parser');
 const compression = require('compression');
 let port = 3000;
 let app = express();
 let router = express.Router();
 app.use(compression());
 app.use(bodyParser.json());
 app.use('/api', router); // Adding router middleware in the express js 
 
 let doc = require('./doc');
 router.use('/doc', doc);
 
 app.listen(port, (err, req, res, next) => {
        console.log(`server started at ${port}`);
 });
 

Doc.js

 const express = require('express');
 let router = express.Router();
 let httpntlm = require('httpntlm');
 
 var ntlm = require('httpntlm').ntlm;
 var async = require('async');
 var httpreq = require('httpreq');
 var HttpsAgent = require('agentkeepalive').HttpsAgent;
 var keepaliveAgent = new HttpsAgent();
 
 var app = express()
 function getSPConfig() {
     return {
         url: "https://sitecollectionurl",
         username: 'username',
         password: 'password',
         domain: 'domain',
         workstation: '',
         headers: {
             "Accept": "application/json;odata=verbose",
             "content-type": "application/json;odata=verbose;"
         }
     }
 };
 
 router.post('/', function (req, res) {
 
     getDigest(function (json) {
         let  opt = getSPConfig();
         let title=req.body.Title;
 
         console.log(json.d.GetContextWebInformation.FormDigestValue);
         opt.headers['X-RequestDigest'] = json.d.GetContextWebInformation.FormDigestValue
         opt.json = { __metadata: { 'type': 'SP.Data.TestingListItem' },title  };
         httpntlm.post(opt, function success(error, addResponse) {
             res.status(200).send("Added");
         });
     }, function error(err) {
         res.status(500).send(err);
     });
 
 });
 
 function getDigest(returnfun) {
 
             let spConfig = getSPConfig();
 async.waterfall([
     function (callback) {
 
         var type1msg = ntlm.createType1Message(spConfig);
 
         httpreq.post(spConfig.url + "_api/contextinfo", {
             headers: {
                 'Connection': 'keep-alive',
                 'Authorization': type1msg,
                 'accept': 'application/json;odata=verbose'
             },
             agent: keepaliveAgent
         }, callback);
     },
 
     function (res, callback) {
 
         if (!res.headers['www-authenticate'])
             return callback(new Error('www-authenticate not found on response of second request'));
 
         var type2msg = ntlm.parseType2Message(res.headers['www-authenticate']);
         var type3msg = ntlm.createType3Message(type2msg, spConfig);
 
         setImmediate(function () {
             httpreq.post(spConfig.url + "_api/contextinfo", {
                 headers: {
                     'Connection': 'Close',
                     'Authorization': type3msg,
                     'accept': 'application/json;odata=verbose'
                 },
                 allowRedirects: false,
                 agent: keepaliveAgent
             }, callback);
         });
     }
 ], function (err, response) {
     var json = JSON.parse(response.body);
     return returnfun(json);
 
 });
 }
 
 module.exports = router;
 

To Run the express api

Open Command prompt and execute bellow

npm install – to install the node dependencies

node app.js – to run the express js

nodemon app.js – to reload the express api while changing (install the nodemon globally -npm install –g nodemon)

Currently using postman to test the app

clip_image001

clip_image002

SharePoint Usage Reports
Usage reports, collaboration and audit for SharePoint.
Categories

Migratiin Tools for SharePoint